中学理科1626729 views
高校物理158371 views
数学講師2856326 views
中学社会667231 views
教育148958 views
高校国語785873 views
高校生物549999 views
高校化学2914160 views
小学理科717454 views
小学算数1195447 views
Help
Tools

English

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