Javascript配列のsortの並び方は本当に分かりましたか?

2049 ワード

sort()は並べ替えの根拠として比較関数を受信することを知っています.
昇順
function sortNumber(a,b)
{
  return a - b
}
降順
function sortNumber(a,b)
{
  return b - a
}
しかし、なぜ2つの異なる表現を返したら昇順、降順が可能なのか分かりますか?
私たちが見た説明は基本的に次のようになります.例えば、w 3 schoolでの説明です.
  • aがbより小さい場合、順序付けされた配列の中でaがbより前に現れるべきであると、0より小さい値を返す.
  • aがbに等しい場合、0に戻る.
  • aがbより大きいと0より大きい値を返します.
  • これは何の幽霊ですか?これを見たばかりの私と同じように迷うかもしれません..
     
    以下は私自身の理解について話します.
    まずこれを理解します.
     sort()の戻り値
    配列に対する参照.配列は元の配列で並べ替えられ、コピーは生成されません.
    比較関数は0より大きい数を返します.この2つの配列要素は変換が必要です.このように循環的に比較して、最終的に1つの昇順の配列を返します.
    比較関数は0より小さい数を返します.この2つの配列要素は変換を必要としません.このように循環的に比較して、最終的に降順の配列を返します.
    直接コード:
    let arr = [11,1,5,99,3]
    let g = 1
    function compare (a ,b) {
        console.log(`          ${arr} ------  ${g}    a = ${a} , b = ${b} `)
        g++
        return a - b 
    }
    arr.sort(compare)
    console.log(`       ${arr}`)
    このコード出力はこうです.
              11,1,5,99,3 ------  1    a = 11 , b = 1 
              1,11,5,99,3 ------  2    a = 11 , b = 5 
              1,11,11,99,3 ------  3    a = 1 , b = 5 
              1,5,11,99,3 ------  4    a = 11 , b = 99 
              1,5,11,99,3 ------  5    a = 99 , b = 3 
              1,5,11,99,99 ------  6    a = 11 , b = 3 
              1,5,11,11,99 ------  7    a = 5 , b = 3 
              1,5,5,11,99 ------  8    a = 1 , b = 3 
           1,3,5,11,99
    結論
    ソート()順序付けはサイクル比較前後の2つの数値のプロセスであり、サイクル毎に元の配列を変更する.
    毎回の比較で返した値は、今回比較した二つの配列が位置を変える必要があるかどうかを決定するためにのみ使用できます.
    この2つの値を比較して0より大きい場合、2つの配列要素は位置を交換します.
    0より小さいです.これは位置を変えません.
    降順を印刷する過程を試してみてください.
    最後にオブジェクト配列の並べ替え方法を提供します.
    const arr = [
        {name:'  ',age:12},
        {name:'  ',age:13},
        {name:'  ',age:11}
    ]
    function compare(prop){
        return function(a,b){
            const value1 = a[prop];
            const value2 = b[prop];
            return value1 - value2
        }
    }
    arr.sort(compare('age'))
    
    //   
    arr = [
        {name:'  ',age:11}
        {name:'  ',age:12},
        {name:'  ',age:13}, 
    ]