フィルターしたい(filter)

1const people = [
2    { name: "Alice", age: 19 },
3    { name: "Bob", age: 30 },
4    { name: "Charlie", age: 34 },
5    { name: "David", age: 18 },
6];
7
8const adults = people.filter(person => person.age >= 20);
9// -> [{ name: "Bob", age: 30 }, { name: "Charlie", age: 34 }]

filterメソッドで、配列から条件を満たす要素だけを抽出できます。 Arrayの基本的なfilterの使い方は配列したい(filterしたい)を参照してください。 このページでは、オブジェクトの配列(シートから読み込んだ行データなど)を 条件でフィルタリングする実用的なパターンをまとめます。

複数条件で抽出したい

 1const people = [
 2    { name: "Alice", age: 19, active: true },
 3    { name: "Bob", age: 30, active: false },
 4    { name: "Charlie", age: 34, active: true },
 5    { name: "David", age: 18, active: true },
 6];
 7
 8// AND条件(&&)
 9const activeAdults = people.filter(person => person.age >= 20 && person.active);
10// -> [{ name: "Charlie", age: 34, active: true }]

&&(AND)や||(OR)を組み合わせて、複数の条件を1つの式にまとめられます。 条件が複雑になってきたら、条件式を別の関数に切り出すと読みやすくなります。

1function isActiveAdult(person) {
2    return person.age >= 20 && person.active;
3}
4
5const activeAdults = people.filter(isActiveAdult);

リストに含まれるかどうかで抽出したい(includes)

1const targetNames = ["Alice", "David"];
2const targeted = people.filter(person => targetNames.includes(person.name));
3// -> [{ name: "Alice", ... }, { name: "David", ... }]

Array.includesと組み合わせると、 特定の値のリストに含まれる要素だけを抽出できます。 スプレッドシートで選択したIDや名前の一覧を元に絞り込みたい場合などに便利です。

Objectをフィルタリングしたい

 1const scores = {
 2    Alice: 85,
 3    Bob: 42,
 4    Charlie: 91,
 5    David: 38,
 6};
 7
 8// 60点以上の人だけ残す
 9const passed = Object.fromEntries(
10    Object.entries(scores).filter(([name, score]) => score >= 60)
11);
12// -> { Alice: 85, Charlie: 91 }

Object自体にはfilterメソッドがありません。 Object.entriesで[キー, 値]の配列に変換してからfilterを使い、 Object.fromEntriesでObjectに戻す、という流れになります。

Mapをフィルタリングしたい

 1const scores = new Map([
 2    ["Alice", 85],
 3    ["Bob", 42],
 4    ["Charlie", 91],
 5    ["David", 38],
 6]);
 7
 8// 60点以上の人だけ残す
 9const passed = new Map(
10    [...scores].filter(([name, score]) => score >= 60)
11);
12// -> Map(2) { "Alice" => 85, "Charlie" => 91 }

MapもObjectと同様に、直接filterを使うことはできません。 スプレッド演算子([...map])で[キー, 値]の配列に変換してからfilterし、 new Map(...)でMapに戻します。

ヒント

特定のキーの一覧でMapを絞り込みたい場合は、 Map型したい(特定のキーを取得したい)により実践的な例があります。

リファレンス