JavaScript:sort()とLodashを使ってオブジェクトの配列をソート
JavaScriptでオブジェクトの配列をプロパティ値でソートする方法
sort() メソッドを使う
JavaScriptの標準機能である sort()
メソッドを使う方法は、最もシンプルで分かりやすい方法です。
const objects = [
{ name: "John", age: 30 },
{ name: "Mary", age: 25 },
{ name: "Bob", age: 40 },
];
// 年齢で昇順にソート
objects.sort((a, b) => a.age - b.age);
console.log(objects); // [{name: "Mary", age: 25}, {name: "John", age: 30}, {name: "Bob", age: 40}]
// 名前で降順にソート
objects.sort((a, b) => b.name.localeCompare(a.name));
console.log(objects); // [{name: "Bob", age: 40}, {name: "John", age: 30}, {name: "Mary", age: 25}]
sort()
メソッドは、配列の要素を比較する関数を受け取り、その比較結果に基づいて配列をソートします。
上記の例では、a.age - b.age
または b.name.localeCompare(a.name)
という比較関数を使って、年齢または名前でソートしています。
a.age - b.age
は、a
の年齢とb
の年齢を比較して、年齢が小さい方を先頭にします。b.name.localeCompare(a.name)
は、b
の名前とa
の名前を比較して、名前が大きい方を先頭にします。
Lodashなどのライブラリを使うと、より簡単にオブジェクトの配列をソートすることができます。
const _ = require("lodash");
const objects = [
{ name: "John", age: 30 },
{ name: "Mary", age: 25 },
{ name: "Bob", age: 40 },
];
// 年齢で昇順にソート
const sortedObjectsByAge = _.sortBy(objects, "age");
console.log(sortedObjectsByAge); // [{name: "Mary", age: 25}, {name: "John", age: 30}, {name: "Bob", age: 40}]
// 名前で降順にソート
const sortedObjectsByName = _.sortBy(objects, (obj) => obj.name.toLowerCase().reverse());
console.log(sortedObjectsByName); // [{name: "Bob", age: 40}, {name: "John", age: 30}, {name: "Mary", age: 25}]
Lodashの sortBy()
メソッドは、ソートしたいプロパティの名前と、オプションで比較関数を受け取り、その結果に基づいて配列をソートします。
上記の例では、age
または obj.name.toLowerCase().reverse()
というプロパティを指定して、年齢または名前でソートしています。
JavaScriptでオブジェクトの配列をプロパティ値でソートするには、sort()
メソッドまたは Lodashなどのライブラリを使うことができます。
補足
sort()
メソッドは、配列を直接変更します。元の配列を保持したい場合は、slice()
メソッドを使ってコピーしてからソートする必要があります。- Lodashなどのライブラリは、多くの便利なユーティリティ関数を提供しています。オブジェクトの配列をソートする以外にも、さまざまな処理を簡単に実行できます。
sort() メソッドを使う
const objects = [
{ name: "John", age: 30 },
{ name: "Mary", age: 25 },
{ name: "Bob", age: 40 },
];
// 年齢で昇順にソート
objects.sort((a, b) => a.age - b.age);
console.log(objects); // [{name: "Mary", age: 25}, {name: "John", age: 30}, {name: "Bob", age: 40}]
// 名前で降順にソート
objects.sort((a, b) => b.name.localeCompare(a.name));
console.log(objects); // [{name: "Bob", age: 40}, {name: "John", age: 30}, {name: "Mary", age: 25}]
Lodashなどのライブラリを使う
const _ = require("lodash");
const objects = [
{ name: "John", age: 30 },
{ name: "Mary", age: 25 },
{ name: "Bob", age: 40 },
];
// 年齢で昇順にソート
const sortedObjectsByAge = _.sortBy(objects, "age");
console.log(sortedObjectsByAge); // [{name: "Mary", age: 25}, {name: "John", age: 30}, {name: "Bob", age: 40}]
// 名前で降順にソート
const sortedObjectsByName = _.sortBy(objects, (obj) => obj.name.toLowerCase().reverse());
console.log(sortedObjectsByName); // [{name: "Bob", age: 40}, {name: "John", age: 30}, {name: "Mary", age: 25}]
その他の方法
Array.prototype.reduce()
メソッドを使って、オブジェクトの配列を新しい配列に変換し、その新しい配列をソートすることができます。for
ループを使って、オブジェクトの配列をループ処理し、それぞれのオブジェクトを比較してソートすることができます。
これらの方法は、sort()
メソッドや Lodashなどのライブラリを使う方法よりも複雑ですが、より柔軟なソートを行うことができます。
JavaScriptでオブジェクトの配列をプロパティ値でソートするその他の方法
Array.prototype.reduce() メソッドを使う
const objects = [
{ name: "John", age: 30 },
{ name: "Mary", age: 25 },
{ name: "Bob", age: 40 },
];
// 年齢で昇順にソート
const sortedObjectsByAge = objects.reduce((acc, obj) => {
acc.push(obj);
return acc;
}, []).sort((a, b) => a.age - b.age);
console.log(sortedObjectsByAge); // [{name: "Mary", age: 25}, {name: "John", age: 30}, {name: "Bob", age: 40}]
// 名前で降順にソート
const sortedObjectsByName = objects.reduce((acc, obj) => {
acc.push(obj);
return acc;
}, []).sort((a, b) => b.name.localeCompare(a.name));
console.log(sortedObjectsByName); // [{name: "Bob", age: 40}, {name: "John", age: 30}, {name: "Mary", age: 25}]
例えば、以下のように、複数のプロパティに基づいてソートすることができます。
const sortedObjects = objects.reduce((acc, obj) => {
acc.push(obj);
return acc;
}, []).sort((a, b) => {
if (a.age === b.age) {
return b.name.localeCompare(a.name);
} else {
return a.age - b.age;
}
});
console.log(sortedObjects); // [{name: "Mary", age: 25}, {name: "John", age: 30}, {name: "Bob", age: 40}]
const objects = [
{ name: "John", age: 30 },
{ name: "Mary", age: 25 },
{ name: "Bob", age: 40 },
];
// 年齢で昇順にソート
for (let i = 0; i < objects.length; i++) {
for (let j = i + 1; j < objects.length; j++) {
if (objects[i].age > objects[j].age) {
const temp = objects[i];
objects[i] = objects[j];
objects[j] = temp;
}
}
}
console.log(objects); // [{name: "Mary", age: 25}, {name: "John", age: 30}, {name: "Bob", age: 40}]
// 名前で降順にソート
for (let i = 0; i < objects.length; i++) {
for (let j = i + 1; j < objects.length; j++) {
if (objects[i].name.localeCompare(objects[j].name) < 0) {
const temp = objects[i];
objects[i] = objects[j];
objects[j] = temp;
}
}
}
console.log(objects); // [{name: "Bob", age: 40}, {name: "John", age: 30}, {name: "Mary", age: 25}]
この方法は、最も原始的な方法ですが、他の方法よりも理解しやすい
javascript arrays sorting