5

次の関数が文字列を数値でソートする理由(コードの3番目のセクション)を理解するのに問題があります。

var myArray = [10, 44, 32, 100, 0, 44, 3, 4];
console.log(myArray.toString()); // 10, 44, 32, 100, 0, 44, 3, 4 --> unsorted

myArray.sort();
console.log(myArray.toString()); // 0,10,100,3,32,4,44,44 --> sorted like strings

// this is what confuses me:
myArray.sort(function (a, b) {
return a - b;
});
console.log(myArray.toString()); // 0,3,4,10,32,44,44,100 --> sorted numerically

具体的には

  1. どのようaにしbて人口を増やしますか?

  2. なぜ減算a - bは数値を番号順にソートするのですか?

  3. 関数が一度に2つの数値のみを検査している場合、すべての数値を適切な順序に並べ替えるにはどうすればよいですか?(すなわちab

4

3 に答える 3

9

.sort関数である必要があるオプションのパラメータを取ります。

.sorta次に、その関数を繰り返し呼び出し、配列から値のペア(およびbパラメーター)を渡します。次に、関数は次のように解釈される値を返します。

  • 戻り値が0未満の場合、a < b
  • 戻り値が0より大きい場合、a > b
  • 戻り値が正確に0の場合、a == b

これを使用して.sort、ブラウザが使用するようにプログラムされている並べ替えアルゴリズムを使用して、アイテムの順序を把握します。

並べ替え機能がない場合は.sort、アイテムを文字列として並べ替えます。これは、デザインの任意のポイントにすぎません。.sort理想的には、関数が値を数値として比較するように強制する場合のように、必要なときにいつでも使用できる関数を渡す必要があります。

于 2013-02-17T23:13:51.497 に答える
3

何らかの理由で(そしてドキュメントを見つける必要があります)、デフォルトの動作Array.prototype.sortは数値ではなく文字列でソートすることです。つまり、数値の並べ替え動作を定義する必要があります。

  1. どのようaにしbて人口を増やすか-関数型プログラミングの世界へようこそ。配列は内部で繰り返され、要素がなくなるまでコールバック関数がa(最初の要素)とb(2番目の要素)で呼び出されます。あなたはこれについてあまり心配する必要はありません、ただそれが起こることを知っているだけです。

  2. 幸いなことに、これに関するドキュメントはかなり明確ですコールバックの戻り値が0未満の場合、aインデックスは。より低くなりbます。が返される場合0は、他の要素に対して同じインデックスに保持します。正の値が返された場合、のbインデックスは。よりも低くなりaます。つまりa - b、数値の並べ替えで正しく機能することが保証されています。 ただし、数値以外の要素がある場合は、このコールバック関数で問題が発生します。配列に数値要素のみが含まれていることがわかっている場合にのみ使用してください。

  3. これは単純な挿入ソートを実行し、実際には一度に2つは実行されませんが、bたまたまが。未満の場合はバックトラックしますaconsole.log(a,b)sortコールバックメソッドにを追加することで、この動作を調べることができます。

于 2013-02-17T23:16:44.490 に答える
0

JavaScript.sort()関数は、デフォルトでは、常に配列をその内容が文字列であるかのように並べ替えます。それはまさにそれがすることです。基本的に、デフォルトのソート関数は.toString()各値に対してを実行します。

仕様へのリンクは次のとおりです。非常に紛らわしいですが、重要なのは、ソート比較プロセスの説明の終わりに向かっていることです。

于 2013-02-17T23:11:35.597 に答える