最初に
個人的なメモです
sort()中の返り値での挙動の理解に手間取ったのでメモとして残します
Array.sort((n, m) => (n > m ? -1 : 1)) について考える
sort(n,m)はnとmの比較結果を
- 0 :(優先度が同じ)
- 1 :(nがmより優先度が低かったので)
- -1:(nがmより優先度が高かったので)
で返す
ここでの優先度とは?
- 優先度は高いほど配列の前に並ぶ
- -1は前に 1は後ろに 0はそのまま
自分が混乱したのは1の挙動
以下自分の解釈
nとmを比較する際にmより後ろにあるnをどうするかという話 なので
今、mより優先度の低い扱いを受けているnを、mより優先度を高くするの?という問いかけが
n 比較演算子 m ? -1 : 1
なので
返り値1の場合は もともとmより優先度が低い扱いを受けているnにあらためてmより優先度が低いよと伝えているだけ なので順番は変わらない
// 例
const arr = [1, 3, 8, 15,8];
//arr.sort(n,m)でnをどうしたいの?
//↑はつまり、この配列arrをどうしたいの?降順?昇順?にしたいの?ってこと
//大きい順にならべたい場合
//nがmより大きいなら配列の前に並べて欲しい(優先度を高くして欲しい)
// n>m の時に nを配列の前に(優先度高い)並べたい = -1を返す
console.log(
[...arr].sort((n, m) => (n > m ? -1 : 1)) // Array [15, 8, 8, 3, 1]
);
// 小さい順にならべたい場合
// nがmより小さいなら配列の前に並べて欲しい(優先度を高くして欲しい)
// n<m の時に nを配列の前に(優先度高い)並べたい= -1を返す
console.log(
[...arr].sort((n, m) => (n < m ? -1 : 1)) // Array [1, 3, 8, 8, 15]
);
console.log(arr);// Array [1, 3, 8, 15, 8]
// ちなみにスプレッド構文を使わないで[...arr].sortじゃなくarr.sortとするとarrの中の並び順そのものが変更される破壊的メソッドになるのでスプレッドにしている
// ただし、スプレッド構文はシャローコピーなのでオブジェクトの場合、ネストの深さが第2階層以降は破壊される
// シャローコピーやスプレッド構文についての詳細はご自身でお調べください
上記コードを試したい場合は
Array.prototype.sort()の試してみましょうに貼り付ける試せます
ここでarray.sortと[...array].sortを比べてもいいかと