こう 聞かれます
- 「配列の map、
filter、 reduce の 違いを 説明してください」 - 「商品の
一覧から、 在庫の ある 品だけの 合計金額を 出すなら、 どう 書きますか」 - 「map と forEach は、
どう 使い分けていますか」
面接官が 見ている点
- 3 つを
「何を返すか」で 区別して話せるか - 元の
配列を 変えずに、 新しい 配列や値を 返すと 分かっているか - forEach との
違いを、 戻り値の 有無で 説明できるか
短い答え
- map は
全部の 要素を 別の 値に 変えた 新しい 配列を、 filter は 条件に 合う 要素だけを 残した 新しい 配列を 返します。 - reduce は
要素を 順に 足し合わせる などして、 配列を 1 つの 値に まとめます。 - どれも
元の 配列は 変えずに 結果を 返すので、 絞る、 変える、 まとめる、の 順に つなげて 書けます。
少し 詳しい答え
つなげて使う
偶数だけを
JavaScript
const nums = [1, 2, 3, 4];
const evens = nums.filter(
(n) => n % 2 === 0
);
const tens = evens.map(
(n) => n * 10
);
const total = tens.reduce(
(sum, n) => sum + n,
0
);
console.log(evens);
console.log(tens);
console.log(total);
console.log(nums);[ 2, 4 ]
[ 20, 40 ]
60
[ 1, 2, 3, 4 ]最後のnums が0 は、
forEach との違い
forEach は、
JavaScript
const nums = [1, 2, 3];
const a = nums.forEach(
(n) => n * 2
);
const b = nums.map(
(n) => n * 2
);
console.log(a);
console.log(b);undefined
[ 2, 4, 6 ]新しい
作った
よく ある間違い
- 「map は
元の 配列を 書き換える」と言う map は 新しい 配列を 返し、 元の 配列は そのままです。 ただし中の オブジェクトを 関数の 中で 書き換えると、 元の 側も 変わります - reduce に
初期値を渡さない 空の 配列で 初期値が 無いと、 TypeError に なります。 合計なら 0を渡しておきます - 新しい
配列を 作る ために forEach と push を使う 動きますが、 意図が 読み取りにくくなります。 変える 目的なら map、 絞る 目的なら filter を使います
深掘りの問い
- 「filter と find の違いは」 filter は
合う 要素を 全部、 配列で 返します。 find は 最初に 合った 1 つだけを 返し、 無ければ undefined です - 「filter と map と reduce を
全部 reduce 1 つで 書けますか」 書けますが、 読む人が 意図を 追いにくくなります。 段ごとに 分けると、 それぞれの 目的が 名前で 分かる、と答えます - 「React で
一覧を 出すとき、 map を どう 使いますか」 配列の 要素を 画面の 部品に 変えて 返し、 それぞれに 見分ける ための key を 付ける、と答えます