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;
});

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