0

私は2つの配列を持っています:

var a1 = [ { ID: 2, N:0 }, { ID: 1, N:0 } ];
var a2 = [ { ID: 1, N:0 }, { ID: 2, N:0 }, { ID: 3, N:0 } ];

a2on であるが in ではないすべての要素を取得する必要がありa1ます。ここでの要素は、プロパティによってのみ別の要素と区別IDされます。他のプロパティは無視する必要があります。また、配列の要素の順序を保証することはできません。この例の結果は次のようになります。

var result = [ { ID: 3, N:0 } ]; // result for the example above

効率的な方法でこれを行うにはどうすればよいですか?(500 から 5,000 の長さの配列を比較します)

4

2 に答える 2

3

これを効率的に行うには、既に a1 にあるアイテムのインデックスを作成して、a2 を循環し、それぞれをインデックスと比較して、既に表示されているかどうかを確認できるようにする必要があります。インデックスに JavaScript オブジェクトを使用できます。a1 を循環し、そのすべての ID をインデックスに入れます。次に、a2 を循環して、ID がインデックスに表示されないアイテムを収集します。

function findUniques(testItems, baseItems) {
    var index = {}, i;
    var result = [];

    // put baseItems id values into the index
    for (i = 0; i < baseItems.length; i++) {
        index[baseItems[i].ID] = true;
    }

    // now go through the testItems and collect the items in it 
    // that are not in the index
    for (i = 0; i < testItems.length; i++) {
        if (!(testItems[i].ID in index)) {
            result.push(testItems[i]);
        }
    }
    return(result);
}

var a1 = [ { ID: 2, N:0 }, { ID: 1, N:0 } ];
var a2 = [ { ID: 1, N:0 }, { ID: 2, N:0 }, { ID: 3, N:0 } ];

var result = findUniques(a2, a1);
// [{"ID":3,"N":0}]

実際のデモ: http://jsfiddle.net/jfriend00/uDEtg/

于 2012-04-06T20:24:06.713 に答える
0

同じ質問が数回投稿されています。こちらをご覧ください。

JavaScript配列の違い

ただし、ほとんどのソリューションは「ネイティブ」JavaScriptを介して提供されます。私はbackbone.jsを使用して多くのものを構築し、アンダースコアはBackboneの依存関係であるため、underscore.jsを使用することを好むことがあります。だから私はその素晴らしいユーティリティを使うことができます。あなたはそれらをロードすることを検討するかもしれません:

http://documentcloud.github.com/underscore/

var a1 = [ { ID: 2, N:0 }, { ID: 1, N:0 } ];
var a2 = [ { ID: 1, N:0 }, { ID: 2, N:0 }, { ID: 3, N:0 } ];

var from, to;
if(a1 > a2){
    from = a1
    to = a2
} else {
    from = a2
    to = a1
}

var a3 = _.filter(from, function(obj){
    var compare = _.find(to, function(obj2){ return obj.ID === obj2.ID });
    return compare === undefined
});
console.log(a3);

最初に最長の配列を決定しました。これは、できるだけ多くのオブジェクトを短いリストと比較したいためです。そうでなければ、私たちはいくつかを「忘れる」でしょう。

次に、フィルターを使用してunderscore.jsライブラリで検索し、短い配列には含まれていないが長い配列にはあるオブジェクトを返します。

両方の配列の長さが等しい場合も問題ありません。すべてのアイテムを他のすべてのアイテムと比較するためです。

于 2012-04-06T20:21:11.087 に答える