高校日本史190258 views
いろは3002230 views
教育149270 views
高校化学2919622 views
高校倫理1437640 views
中学数学622753 views
世界の国562865 views
高校物理159249 views
ヒストリア287936 views
高校生物550830 views

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() の方が効率的です。