2

オブジェクト リテラルの配列を並べ替える必要があり、オブジェクトの 2 つのプロパティを比較する必要があります。それを行う方法の例をオンラインで見つけましたが、仕様にサポートドキュメントが見つかりませんでした。Javascriptで次のことができることを誰でも確認できますか?おそらくいくつかのドキュメントを教えてください:

users.sort(function(a, b){ 
    return [a.name, a.company] > [b.name, b.company] ? 1:-1; 
});

編集:これが機能している理由がわかりました。これは、単純に文字列を連結してから比較しているためです。意図があまり明確ではないと思うので、おそらくもう少しハックではないものを書きます。

また、ドキュメントで簡単に見つけることができるカスタム並べ替え関数を作成できるかどうかを単に尋ねたわけではありません。この特定のケースで行っていた方法が有効かどうかを尋ねていました。

4

5 に答える 5

3

あなたはできる。

于 2012-08-08T14:41:57.187 に答える
2

コメントですでに説明したように、はい、そのようにすることができます。

ここで何が起きてるの?

比較で配列を使用する場合は常に、配列は文字列表現に変換されます。これは、その要素のカンマ区切りのリストです。JavaScript は、配列の各要素を個別に比較していません。

したがって、あなたの例では、と連結a.namea.company、この連結b.nameb.company比較しています。

"nameA,companyA" > "nameB,companyB"

キャッチは何ですか?

ただし、これらの値のいずれかが数値 (文字列ではない) の場合、問題が発生します。これは、数値の辞書順が数値の順序と異なるためです。

例えば:

> ['a', 100] > ['a', 11]
  false

と比較すること'a,100''a,11'なり、の01にあるため、最初の文字列は 2 番目の文字列よりも小さくなります。


要するに、文字列値のみを扱っていることがわかっている場合は、おそらく問題ありませんが、暗黙の連結は理解するのが難しい場合があります。
データ型を混在させたら、値を個別に比較する必要があります。

于 2012-08-08T15:01:25.727 に答える
1

sort機能面では、参考までMozilla Developer Networkにご覧いただけます。

リファレンス: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort

基本的に、実装できるコールバック関数を定義できますsort。このソート機能が特に機能するのはなぜですか? この単純化された例を試してください:

foo = [1, 2]
[1, 2]
bar = [3, 4]
[3, 4]
foo > bar
>> false
bar > foo
>> true

配列の文字列表現を比較することにより、Javascript は結果として配列の値を評価する場合があります。

于 2012-08-08T14:45:17.370 に答える
0

はい、有効です。ここにMDNのドキュメントがあります

于 2012-08-08T14:43:01.383 に答える
0

確かに、引数Array.sortを取る関数でcmpあり、それ自体が比較する 2 つの引数を取る関数です。

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

于 2012-08-08T14:43:36.030 に答える