こんなデータを複数条件でソートしたいときの提案です。
const arr = [
{name: 'Tanaka', age: 26, sex: 'Male'},
{name: 'Sato', age: 15, sex: 'Female'},
{name: 'Ishida', age: 42, sex: 'Male'}
];
よくあるやつ
調べると出てくるやつです。
直感的ですが全ての比較を2回ずつ書かなきゃいけないところが嫌な感じです。
arr.sort((a, b) => {
if (a.name > b.name) return 1;
if (a.name < b.name) return -1;
if (a.age > b.age) return 1;
if (a.age < b.age) return -1;
if (a.sex > b.sex) return 1;
if (a.sex > b.sex) return 1;
return 0
});
提案方式
こんな風に書くのはどうでしょうか。
比較値生成関数を定義する手間はかかりますがスマートな感じがします。
const comp = (a, b) => [
a.name > b.name,
a.age > b.age,
a.sex > b.sex
].reduce((x, y) => x << 1 | y);
arr.sort((a, b) => comp(a, b) - comp(b, a));
comp関数で、bit演算で各桁と比較条件を対応付けて、真のときに1立てています。
例えば以下のようになります。
const a = {name: "AAA", age: 1, sex: "Male"};
const b = {name: "XXX", age: 0, sex: "Male"};
// comp(a, b) = 0b010
// comp(b, a) = 0b100