JSON データのフィルタリング

API から取得した JSON データを、必要な条件でフィルタリングする方法を解説します。配列メソッドの filter() を中心に、様々なフィルタリングパターンを見ていきます。

基本的なフィルタリング

filter() メソッドを使うと、条件に合う要素だけを抽出した新しい配列を作成できます。

const users = [
  { id: 1, name: "田中", age: 25, active: true },
  { id: 2, name: "山田", age: 30, active: false },
  { id: 3, name: "佐藤", age: 22, active: true },
  { id: 4, name: "鈴木", age: 35, active: true }
];

// アクティブなユーザーのみ
const activeUsers = users.filter(user => user.active);

// 25歳以上のユーザー
const adults = users.filter(user => user.age >= 25);

filter() は元の配列を変更せず、新しい配列を返します。

複数条件でのフィルタリング

論理演算子を使って、複数の条件を組み合わせることができます。

// アクティブかつ30歳未満
const youngActive = users.filter(user => user.active && user.age < 30);

// 25歳以上または非アクティブ
const filtered = users.filter(user => user.age >= 25 || !user.active);

条件が複雑な場合は、関数として切り出すと読みやすくなります。

function isTargetUser(user) {
  return user.active && user.age >= 20 && user.age < 30;
}

const targetUsers = users.filter(isTargetUser);

文字列を含むかでフィルタリング

includes() と組み合わせて、文字列の部分一致でフィルタリングできます。

const products = [
  { name: "赤りんご", price: 150 },
  { name: "青りんご", price: 120 },
  { name: "バナナ", price: 100 },
  { name: "りんごジュース", price: 200 }
];

// 「りんご」を含む商品
const appleProducts = products.filter(p => p.name.includes("りんご"));
// [{ name: "赤りんご", ... }, { name: "青りんご", ... }, { name: "りんごジュース", ... }]

大文字小文字を無視する場合は、toLowerCase() を使います。

const searchTerm = "Apple";
const results = products.filter(p => 
  p.name.toLowerCase().includes(searchTerm.toLowerCase())
);

ネストした配列のフィルタリング

配列の中に配列がある場合、some() や every() と組み合わせます。

const orders = [
  { id: 1, items: ["りんご", "バナナ"] },
  { id: 2, items: ["みかん", "ぶどう"] },
  { id: 3, items: ["りんご", "みかん"] }
];

// りんごを含む注文
const withApple = orders.filter(order => order.items.includes("りんご"));

// りんごまたはバナナを含む注文
const fruits = ["りんご", "バナナ"];
const hasFruit = orders.filter(order => 
  order.items.some(item => fruits.includes(item))
);
some()

配列の要素のうち、1つでも条件を満たせば true

every()

配列のすべての要素が条件を満たせば true

オブジェクトのフィルタリング

Object.entries() と filter() を組み合わせて、オブジェクトのプロパティをフィルタリングできます。

const scores = {
  math: 80,
  english: 45,
  science: 90,
  history: 55,
  art: 72
};

// 60点以上の科目だけを抽出
const passed = Object.fromEntries(
  Object.entries(scores).filter(([subject, score]) => score >= 60)
);

console.log(passed);
// { math: 80, science: 90, art: 72 }

find() との違い

filter() は条件に合うすべての要素を返しますが、find() は最初の1つだけを返します。

const users = [
  { id: 1, name: "田中" },
  { id: 2, name: "山田" },
  { id: 3, name: "佐藤" }
];

// filter: 条件に合う全要素(配列)
const allResults = users.filter(u => u.id >= 2);
// [{ id: 2, name: "山田" }, { id: 3, name: "佐藤" }]

// find: 最初の1要素(オブジェクト)
const firstResult = users.find(u => u.id >= 2);
// { id: 2, name: "山田" }

1件だけ取得したい場合は find() の方が効率的です。