中学理科1629033 views
ヒストリア287936 views
りんご203078 views
数学講師2873614 views
中学数学622753 views
中学社会667895 views
Computer366970 views
高校倫理1437640 views
小学算数1198604 views
世界の国562865 views

JSON データのソート

API から取得した JSON データを並び替える方法を解説します。配列の sort() メソッドを使いこなすことで、様々な条件でデータをソートできるようになります。

sort() の基本

sort() メソッドは配列を直接変更(破壊的操作)します。元の配列を保持したい場合は、先にコピーを作成してください。

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

// 元配列を変更してしまう
numbers.sort((a, b) => a - b);
console.log(numbers); // [1, 1, 2, 3, 4, 5, 6, 9]

// コピーしてからソート
const original = [3, 1, 4, 1, 5];
const sorted = [...original].sort((a, b) => a - b);

数値でソート

比較関数を渡して、数値の大小を比較します。

const users = [
  { name: "田中", age: 25 },
  { name: "山田", age: 30 },
  { name: "佐藤", age: 22 }
];

// 年齢で昇順(小さい順)
const byAgeAsc = [...users].sort((a, b) => a.age - b.age);

// 年齢で降順(大きい順)
const byAgeDesc = [...users].sort((a, b) => b.age - a.age);
昇順(a - b)

a が小さい場合に負の値を返し、a を前に配置

降順(b - a)

a が大きい場合に負の値を返し、a を前に配置

文字列でソート

文字列の比較には localeCompare() を使用します。これにより、日本語も正しくソートできます。

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

// 名前で昇順
const byNameAsc = [...users].sort((a, b) => 
  a.name.localeCompare(b.name, "ja")
);

// 名前で降順
const byNameDesc = [...users].sort((a, b) => 
  b.name.localeCompare(a.name, "ja")
);

日付でソート

日付文字列は Date オブジェクトに変換するか、ISO 形式であればそのまま比較できます。

const posts = [
  { title: "記事A", date: "2024-03-15" },
  { title: "記事B", date: "2024-01-20" },
  { title: "記事C", date: "2024-02-10" }
];

// 日付で昇順(古い順)
const oldest = [...posts].sort((a, b) => 
  new Date(a.date) - new Date(b.date)
);

// 日付で降順(新しい順)
const newest = [...posts].sort((a, b) => 
  new Date(b.date) - new Date(a.date)
);

ISO 形式(YYYY-MM-DD)の場合は文字列比較でも正しくソートできます。

const newest = [...posts].sort((a, b) => b.date.localeCompare(a.date));

複数条件でソート

第一条件が同じ場合に第二条件で並び替える方法です。

const users = [
  { name: "田中", age: 25, score: 80 },
  { name: "山田", age: 25, score: 90 },
  { name: "佐藤", age: 30, score: 85 }
];

// 年齢で昇順、同じ年齢ならスコアで降順
const sorted = [...users].sort((a, b) => {
  if (a.age !== b.age) {
    return a.age - b.age;
  }
  return b.score - a.score;
});

汎用的なソート関数

ソート条件を引数で受け取る汎用関数を作ると便利です。

function sortBy(array, key, order = "asc") {
  const multiplier = order === "desc" ? -1 : 1;
  
  return [...array].sort((a, b) => {
    if (a[key] < b[key]) return -1 * multiplier;
    if (a[key] > b[key]) return 1 * multiplier;
    return 0;
  });
}

// 使用例
sortBy(users, "age", "asc");
sortBy(users, "name", "desc");

null や undefined の扱い

ソート対象に null や undefined が含まれる場合は、特別な処理が必要です。

const items = [
  { name: "A", value: 10 },
  { name: "B", value: null },
  { name: "C", value: 5 },
  { name: "D", value: undefined }
];

// null/undefined を最後に配置
const sorted = [...items].sort((a, b) => {
  if (a.value == null) return 1;
  if (b.value == null) return -1;
  return a.value - b.value;
});

適切なソート処理を実装することで、ユーザーにとって見やすいデータ表示を実現できます。