10

このコードサンプルをご覧になるか、jsfiddleにアクセスしてください

function printRelation(a, b, out) {
    var text;
    if (a === b) {
        text = "a === b";
    } else if (a == b) {
        text = "a == b";
    } else {
        text = "a != b";
    }
    $('#' + out).text(text);
}

var a = [0, 0, 2], b = a;
printRelation(a, b, 'out1');
a = [0, 0, 2];
b = [0, 0, 2];
printRelation(a, b, 'out2');

両方のテストが出力されることを期待してa === bいましたが、最初のテストのみが出力します。2番目のものはを出力しますa != b。誰かがこの行動を説明できますか?JavaScriptで配列を効率的に比較するにはどうすればよいですか?

4

4 に答える 4

26

Underscore.jsライブラリのisEqualメソッドを使用できます。

http://underscorejs.org/#isEqual

2つのオブジェクト間で最適化された詳細な比較を実行して、それらが等しいと見なされるかどうかを判断します。

var moe   = {name : 'moe', luckyNumbers : [13, 27, 34]};
var clone = {name : 'moe', luckyNumbers : [13, 27, 34]};
moe == clone;
=> false
_.isEqual(moe, clone);
=> true

アップデート

Lodashはアンダースコアに触発されていますが、最近では優れたソリューションです

https://lodash.com/docs/#isEqual

2つのオブジェクト間で最適化された詳細な比較を実行して、それらが等しいと見なされるかどうかを判断します。

var object = { 'a': 1 };
var other = { 'a': 1 };

_.isEqual(object, other);
// => true

object === other;
// => false
于 2012-10-07T16:05:19.390 に答える
12

lodashを使用します。

_.isEqual([1,2],[1,2])

オブジェクトでも機能します。

_.isEqual({a:1}, {a:1})
于 2012-10-07T16:10:36.523 に答える
7

配列はjavascriptのオブジェクトです。==また、文字列や数値を比較するときに通常使用するような方法でオブジェクトを比較することはできません。

配列を比較する方法は他にもたくさんありますが、私のお気に入りはJSONを使用することです。

if ( JSON.stringify(a) == JSON.stringify(b) ) {
    // equal

書き込むときに行うように、既存のオブジェクトを変数に割り当てることはb = a、参照をコピーするだけであることに注意してください。どちらも同じ配列を指しています。

あなたはb = a.slice()本当のコピーを手に入れるためにしなければならないでしょう。

于 2012-10-07T16:00:37.800 に答える
2

あなたが書いたようなJavaScript配列の比較は、単純なオブジェクト参照の比較です。それらは要素ごとの「深い」比較ではありません。

必要に応じて、長さが同じで要素が同じであるかどうかを順番に確認するための独自の比較関数を作成できます。編集他の人が指摘しているように、配列比較関数を含むいくつかのライブラリがあります。「平等」の定義に一致するものを見つけ(可能性は低い)、そのライブラリをアーキテクチャに組み込むことを検討してもかまわない場合は、それは良い考えかもしれません。

于 2012-10-07T16:00:28.050 に答える