リストを操作して結果を得るときに、メソッドを繋げて処理する話です。
例えば以下の様に filter して map するといった事です。
分かっている方はそっと閉じてください。。
const data = [
{ id: 1, name: '佐藤', scores: { a: 10, b: 20, c: 30 } },
{ id: 2, name: '鈴木', scores: { a: 11, b: 21, c: 31 } },
{ id: 3, name: '高橋', scores: { a: 12, b: 22, c: 32 } },
{ id: 4, name: '田中', scores: { a: 13, b: 23, c: 33 } },
{ id: 5, name: '渡辺', scores: { a: 14, b: 24, c: 34 } },
];
// b のスコアが偶数の人の名前と b のスコアを得る
const ret = data
.filter((item) => item.scores.b % 2 === 0)
.map((item) => ({ name: item.name, b: item.scores.b }));
// ret に入る結果
// [
// { name: '佐藤', b: 20 },
// { name: '高橋', b: 22 },
// { name: '渡辺', b: 24 },
// ]
filter と map メソッドを使わなかったら
この場合、以下の感じでしょうか。
const ret = [];
for (let item of data) {
if (item.scores.b % 2 === 0) {
ret.push({ name: item.name, b: item.scores.b });
}
}
filter と map メソッドを別にしたら
const temp = data.filter((item) => item.scores.b % 2 === 0);
const ret = temp.map((item) => ({ name: item.name, b: item.scores.b }));
filter で得た temp を他で使うことが無ければ、分ける理由が無いですね。
連続で使ってソートもしてみる
結果の並びを、b のスコアが高い順にしてみます。
const ret = data
.filter((item) => item.scores.b % 2 === 0)
.map((item) => ({ name: item.name, b: item.scores.b }))
.sort((item1, item2) => item2.b - item1.b);
// ret に入る結果
// [
// { name: '渡辺', b: 24 },
// { name: '高橋', b: 22 },
// { name: '佐藤', b: 20 },
// ]
1行で書けますが、メソッド毎に改行すると読みやすいです。
慣れないうちは記述しづらいと思いますが、慣れれば楽に処理できて読みやすいと感じると思います。
コメント