本文へスキップ
BecomeCoder

JavaScriptコース · 第9章 モダンな書き方 ― 実務のJavaScript · レッスン34

配列の高階関数を使いこなす ― map / filter / reduce / find

ブラウザで完結

導入

第5章で map / filter に触れました。ここでは実務で毎日使う配列メソッドを、用途ごとに使い分けられるように整理します。for を書かずにデータを加工するのがモダンJSの日常です。

説明

代表的な6つを押さえましょう。

const nums = [1, 2, 3, 4, 5, 6];

console.log(nums.filter((n) => n % 2 === 0).join(","));  // 2,4,6(条件で絞る)
console.log(nums.map((n) => n * 10).join(","));          // 10,20,...(各要素を変換)
console.log(nums.reduce((sum, n) => sum + n, 0));        // 21(1つの値に畳み込む)

find は最初に条件を満たした要素、some / every は「1つでも/すべて」を真偽で返します。

const users = [
  { name: "太郎", age: 20 },
  { name: "花子", age: 17 },
  { name: "次郎", age: 25 },
];

console.log(users.find((u) => u.age >= 18).name);  // 太郎(最初に見つかった人)
console.log(users.some((u) => u.age < 18));        // true(未成年が1人でもいる?)
console.log(users.every((u) => u.age >= 18));      // false(全員成人?)

使い分けの目安です。

やりたいことメソッド
条件で絞り込むfilter
全部を別の形に変換map
合計・最大など1つにまとめるreduce
最初の1件を探すfind
条件を満たすものが「ある?」some
「すべて」満たす?every

これらは元の配列を壊さず、新しい結果を返すのがポイントです。.filter(...).map(...) のようにつなげて書けます。

const names = users
  .filter((u) => u.age >= 18)
  .map((u) => u.name);
console.log(names.join("・"));  // 太郎・次郎

やってみよう

reduce で最大値を求めたり、filtermap をつないで「18歳以上の名前一覧」を作ったりしてみましょう。

演習

const scores = [40, 80, 60, 90]; の合計を reduce で求めて表示してください。

ヒント1を見る

console.log(scores.reduce((s, n) => s + n, 0));

実際に動かしてみよう

下のエディタにJavaScriptを書いて「実行」を押すと、ブラウザ内のJavaScriptで出力が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう(console.log の結果が下に出ます。input() を使う回は「標準入力」欄に値を入れてから実行します)。

JavaScript — ブラウザ内で実行

ブラウザ本体のJavaScriptで実行する学習用環境を読み込みます(外部エンジン不要・軽量です)。
スクロールして表示された時点でも自動で読み込まれます。