JavaScript 配列の絞り込み:filter・find・some の使い方

スポンサーリンク

JavaScript 配列の絞り込み:filter・find・some の使い方

配列から「条件に合う要素だけ取り出す」には filterfindfindIndexsomeevery を使います。何を確認したいかによって使い分けます。


早わかりまとめ

メソッド 戻り値 向いている用途
filter 新しい配列 条件に合う要素をすべて取り出す
find 要素 or undefined 条件に合う最初の要素を1つ取り出す
findIndex インデックス or -1 条件に合う最初の要素の位置を調べる
some boolean 1つでも条件を満たすか確認する
every boolean すべて条件を満たすか確認する
includes boolean 特定の値が含まれるか確認する

filter:条件に合う要素をすべて取り出す

const numbers = [1, 2, 3, 4, 5, 6]

// 偶数だけ取り出す
const evens = numbers.filter((n) => n % 2 === 0)
console.log(evens) // [2, 4, 6]

// 3より大きい数
const big = numbers.filter((n) => n > 3)
console.log(big) // [4, 5, 6]

オブジェクトの配列でよく使います。

const users = [
  { id: 1, name: 'Alice', active: true },
  { id: 2, name: 'Bob', active: false },
  { id: 3, name: 'Carol', active: true },
]

// アクティブなユーザーだけ
const activeUsers = users.filter((user) => user.active)
// [{ id: 1, name: 'Alice', ... }, { id: 3, name: 'Carol', ... }]

条件に合う要素がなければ空配列 [] を返します(undefined にはなりません)。


find:条件に合う最初の1件を取り出す

const users = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 3, name: 'Carol' },
]

// id が 2 のユーザーを1件取得
const user = users.find((u) => u.id === 2)
console.log(user) // { id: 2, name: 'Bob' }

条件に合う要素がない場合は undefined を返すため、存在確認が必要です。

const found = users.find((u) => u.id === 99)
console.log(found) // undefined

// 安全に使う
if (found) {
  console.log(found.name)
}

filter との違い:filter は全件返す・find は最初の1件だけ返す。


findIndex:インデックスで位置を調べる

const fruits = ['apple', 'banana', 'cherry']

const index = fruits.findIndex((f) => f === 'banana')
console.log(index) // 1

// 見つからない場合は -1
const notFound = fruits.findIndex((f) => f === 'grape')
console.log(notFound) // -1

splice で削除するときなど、インデックスが必要なケースで使います。

// banana を配列から削除
const idx = fruits.findIndex((f) => f === 'banana')
if (idx !== -1) {
  fruits.splice(idx, 1)
}
console.log(fruits) // ['apple', 'cherry']

some:1つでも条件を満たすか確認する

const scores = [40, 55, 70, 80]

// 60点以上が1つでもあるか
const hasPassed = scores.some((score) => score >= 60)
console.log(hasPassed) // true

// 全員が60点以上か確認
const allPassed = scores.every((score) => score >= 60)
console.log(allPassed) // false(40点がいる)

some は条件に合う要素が見つかった時点で処理を止めます(find と同様)。


every:すべて条件を満たすか確認する

const items = [
  { name: 'A', inStock: true },
  { name: 'B', inStock: true },
  { name: 'C', inStock: false },
]

// すべての商品が在庫ありか
const allInStock = items.every((item) => item.inStock)
console.log(allInStock) // false

includes:特定の値が含まれるか確認する

const colors = ['red', 'green', 'blue']

console.log(colors.includes('green')) // true
console.log(colors.includes('yellow')) // false

includes はオブジェクトの比較には使えません(参照比較になるため)。オブジェクトを探す場合は findsome を使います。


まとめ

したいこと 使うもの
条件に合う要素をすべて取り出す filter
条件に合う最初の要素を1つ取り出す find
条件に合う最初の要素の位置を調べる findIndex
1つでも条件を満たすか確認する some
すべて条件を満たすか確認する every
特定の値が含まれるか確認する includes

配列の繰り返し処理(forEach・map・for...of)は「JavaScript 配列の繰り返し:forEach・map・for...of の使い分け」を参照してください。