私は命令型プログラミングのバックグラウンド(Java)であり、FPの概念をよりよく理解しようとしています。特に条件付き分岐/フィルタリング、およびデータのストリーム/リストにどのように適用できるか。機能プログラミング:条件付き分岐/フィルタリングをリストする(JavaScript)
ここでは愚かな人為的な例があります。プレイヤーのリストがあり、スキルレベルに基づいて別のリストに分けたいと考えています。私は、より機能的な方法でこれを達成することができます
const excluded = []; // LOW skilled
const reserves = []; // only MEDIUM/HIGH skilled
const team = []; // only HIGH skilled
const allPlayers = [
{
name: 'personh1',
skillLevel: 'HIGH'
},
{
name: 'personh2',
skillLevel: 'HIGH'
},
{
name: 'personh3',
skillLevel: 'HIGH'
},
{
name: 'personm1',
skillLevel: 'MEDIUM'
},
{
name: 'personm2',
skillLevel: 'MEDIUM'
},
{
name: 'personl1',
skillLevel: 'LOW'
},
{
name: 'personl2',
skillLevel: 'LOW'
}
];
const maxTeamSize = 2;
const maxReservesSize = 2;
allPlayers.forEach(p => {
if (p.skillLevel === 'HIGH') {
if (team.length < maxTeamSize) {
team.push(p);
} else {
reserves.push(p);
}
} else if (p.skillLevel === 'MEDIUM') {
if (reserves.length < maxReservesSize) {
reserves.push(p);
} else {
excluded.push(p);
}
} else {
excluded.push(p);
}
});
// functions defined elsewhere...
notifyOfInclusion(team.concat(reserves));
notifyOfExclusion(excluded);
::(JSとRamdaライブラリを使用して):基本的な命令的なアプローチのようなものかもしれない
team = R.slice(0, maxTeamSize, R.filter(p => p.skillLevel === 'HIGH', allPlayers));
reserves = R.slice(0, maxReservesSize, R.filter(p => (p.skillLevel === 'HIGH' || p.skillLevel === 'MEDIUM') && !R.contains(p, team), allPlayers));
excluded = R.filter(p => !R.contains(p, team) && !R.contains(p, reserves), allPlayers);
notifyOfInclusion(team.concat(reserves));
notifyOfExclusion(excluded);
しかし、それは非常に粗製のようだ、反復と非常に宣言的ではありません。機能的なPOVからこれを実現するためのより良い(よりエレガントな/宣言的な)方法は何ですか?任意の答えにRamdaを使用することは、ボーナスになりますが、必須ではありません。ありがとう。
プレイヤーが不足している場合には、チームに「MEDIUM」プレイヤーとリザーブの「LOW」プレイヤーがいらっしゃいましたら、スキルレベルを「R.sortBy」にしてから「R.slice」にしてください。おかげさまで – GingerPlusPlus