0
2

More than 1 year has passed since last update.

JavaScriptの配列sortを複数条件で行う方式の提案

Last updated at Posted at 2022-10-20

こんなデータを複数条件でソートしたいときの提案です。

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
0
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2