javascript のソートで条件を1行で書く

ソート条件で、不等号が逆で、返り値なだけなのに同じような記述を書かなきゃいけないのをなんとかしたい。

こんな感じ

Array.sort( (a,b) => {
  if(a > b) return -1;
  if(a < b) return 1;
  return 0
})

比較対象のaとbがただの配列だったらいいけど、オブジェクトで階層深かったりすると
結構、無駄が気になる。これを1行にできると単純にコード量1/2になるのと、コピーミスってエラーになる可能性が減る。

で、ぐぐっても出てこなかったので、作ってみた。
aとbの比較ってようはaからbを引いた結果が-か+って話で、降順はa-bか昇順かb-aで変えればいい。

Array.sort( (a,b) => a-b )

基本はこれでオッケーだけど、これだと複数条件のとき0でもreturnを返してしまいます。

Array.sort( (a,b) => {
 if(a.id    > b.id    ) return -1;
 if(a.id    < b.id    ) return  1;
 if(a.type  > b.type  ) return -1;
 if(a.type  < b.type  ) return  1;
 if(a.order > b.order ) return -1;
 if(a.order < b.order ) return  1;
  return 0;
})

Array.sort( (a,b) => {
 (var r=(a.id   - b.id  ))!==0 && return r;
 (var r=(a.type - b.type))!==0 && return r;
  return a.order-b.order;
})

問題は、ぱっと見さっぱりわからないところですね...。

最新のコード これでよかった

var arr = [
{id:1,hp:10,mp:1},
{id:2,hp: 8,mp:7},
{id:3,hp:10,mp:4},
{id:4,hp:10,mp:4},
{id:5,hp:41,mp:8},
];

arr.sort((a,b) =>
 b.hp-a.hp || a.mp-b.mp || a.id-b.id
)
  • a-b 昇順
  • b-a 降順

あとはソートの優先順位順に||で区切って並べればいい

というか、自分の別記事に書いてあった...。