2016-12-13 14 views
1
var arr = [5, 2, 1, -10, 8]; 

arr.sort(function(a, b) { 
    console.log(a,b) 
    return b - a; 

}) ; // 8, 5, 2, 1, -10 

このコールバックはどのように機能しますか?JavaScriptのソート(compareFunction)はどのように機能しますか?

選択肢aとbの原則は何ですか?

この特定の例を内部から説明してください。

出力はconsole.log(最初に、この出力を説明してください):

5 2 
    2 1 
    1 -10 
-10 8 
    1 8 
    2 8 
    5 8 
+0

+ veを返した場合はそれ以外の場合はスワップしません。 ? – Mahi

+1

私は混乱している、あなたが正確に望むもの –

+0

さらに、パブロが提供したものをさらに読む:http://stackoverflow.com/questions/24080785/sorting-in-javascript-shouldnt-returning-a-boolean-be-enough-比較のために/ 24080786#24080786 – vlaz

答えて

5

それは実装に依存します。この実際の実装はinsertion sortのように見えますが、この量のデータ(Chromeの場合と異なり、10個以上のアイテムの実装が異なる可能性があります)は、インデックスゼロから最後まで、スワップ最後の2つの項目で発生していない場合は停止し、それ以外の場合はゼロを戻します。

は、基本的にはテストの順に変化が

5 2 1 -10 8 original order 
5 2 
    2 1 
     1 -10 
      -10 8 swap 
      8 -10 
     1 8  swap 
     8 1 
    2 8   swap 
    8 2 
5 8    swap 
8 5 2 1 -10 result 

より複雑な分類は、アレイの反対側に移動する必要がある2つの大きな値で、何が起こっているかをよりよく示す

8 9 1 2 3 4 original array 
8 9 
    9 1    swap 
    1 9 
8 1     swap 
1 8 
     9 2   swap 
     2 9 
    8 2    swap 
    2 8 
1 2 
      9 3  swap 
      3 9 
     8 3   swap 
     3 8 
    2 3 
       9 4 swap 
       4 9 
      8 4  swap 
      4 8 
     3 4 
1 2 3 4 8 9 result 

ライブの例では、すべてのユーザーエージェントでは動作しません(例えばないエッジではなく、Chromeの)

var array = [8, 9, 1, 2, 3, 4]; 
 
console.log(JSON.stringify(array)); 
 
array.sort(function (a, b) { 
 
    console.log(a , b, JSON.stringify(array)); 
 
    return a - b; 
 
}); 
 
console.log(JSON.stringify(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

彼らはどのように、なぜではないかを知りたい。 – Feathercrown

+0

@Feathercrown、私は*「どのようにsort(compareFunction)が機能するのですか?」と読んでいます* –

+0

質問は最初はなぜタイトルに関係なく尋ねられましたが、とにかく変更されました。 – Feathercrown

2

.sort()カスタム関数とは、魔女のアイテムを示す番号が前に置かれなければならない戻らなければならない:

< 0 - 最初の要素秒前に配置する必要があります。
      0 - 両方の要素が等しい場合は、順序を変更しないでください。
> 0 - 最初の要素の前に2番目の要素を配置する必要があります。 a - bが優勢順序を意味している


通常b - aは子孫ソートを意味します。


要素を並べ替えるために使用されるアルゴリズムは、ブラウザの実装が.sortに応じて異なります。それらの比較を確認してください:

enter image description here

+0

'<0 - 最初の要素は2番目の前に配置する必要があります.'というのは、順序を変更しないことを意味しますか? – Mahi

+1

私はこれらのgifを数時間見ることができます:)クールな例。 – Timmetje

+0

@TimmetjeこれらのGIFで何を学ぶことができますか? – Mahi

0

それは低いか高い値を移動することにより、減算値でアイテムをソートします。ここ

は、いくつかの情報である。

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

compareFunction(比較関数)が与えられている場合、配列の要素を比較する関数の戻り値に応じ ソートされます。 aとbが比較さ 二つの要素である場合、その後:

  • compareFunctionはIF(a、b)は、すなわち、Aが最初に来る、ソートA低いインデックスbより、0未満です。
  • compareFunction(a、b)が0を返す場合は、aとbを互いに変更せず、異なるすべての
    要素に対してソートします。注:ECMAscript標準ではこの
    の動作を保証するものではありません。したがって、すべてのブラウザ(Mozillaのバージョン
    、少なくとも2003年に戻るなど)がこれを尊重するわけではありません。
  • compareFunction(a、b)が0より大きい場合、bをaより小さいインデックスにソートします。
  • compareFunction(a、b)は、特定の要素のペアaとbを2つの引数として指定した場合、常に同じ値を返す必要があります。 一致しない結果が返された場合、ソート順は未定義です。だから、

、関数は次のような形式がある比較:、数字の代わりに文字列を比較するには

function compare(a, b) { 
    if (a is less than b by some ordering criterion) { 
    return -1; 
    } 
    if (a is greater than b by the ordering criterion) { 
    return 1; 
    } 
    // a must be equal to b 
    return 0; 
} 

を比較する機能をより簡単に サブトラクトBすることができます。 (それは無限大とNaNのが含まれていない場合)、次の関数は配列 昇順にソートします:

function compareNumbers(a, b) { 
    return a - b; 
} 
+0

'compareFunction(a、b)が0より小さい場合は、aをbよりも低いインデックスに並べ替えます。つまり、最初に来ます。 – Mahi

+0

それはスキップし、次の値をチェックします。例えば[4,4,6]最初の2つは0なので、移動しません。最後のペアは4,6であり、それは4-6 = -2になるので、配列を4に移動します。配列が[6,4,4] – Timmetje

+0

になるまでこれを続けます。 'それが+ veを返し、それ以外の場合はスワップしないと変換されます。 ? ' – Mahi

関連する問題