1

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

var array_old = [{id:"5436", title:"I Like you boy"}, {id:"5437", title:"Hello how are you"}];
var array_new = [{id:"5436", title:"I Like you boy"}, {id:"1132", title:"I'm fine"}];

$.each(array_old, function(id, array)
{
    if(!$.inArray(array['id'], array_new, 1)>-1){
        alert(array['id'] + " does not exist in array_new");
    }
});

array_old の ID が array_new に存在するかどうかを確認したいので、この例では "5437 does not exist in array_new" が出力されることを期待しています。

それを可能にする機能が見つからないので、どうすればよいですか?

4

4 に答える 4

1

http://jsfiddle.net/tppiotrowski/VHb3Q/2/

var array_old = [{
    id: "5436",
    title: "I Like you boy"},
{
    id: "5437",
    title: "Hello how are you"}];
var array_new = [{
    id: "5436",
    title: "I Like you boy"},
{
    id: "1132",
    title: "I'm fine"}];

$.each(array_old, function(old_index, old_obj) {
    var old_id = old_obj['id'];
    var found = false;
    $.each(array_new, function(new_index, new_obj) {
        if (new_obj['id'] == old_id) {
            found = true;
        }
    });
    if (!found) {
        alert(old_id + " does not exist in array_new");
    }
});​
于 2012-11-20T23:57:15.003 に答える
1

私は自分で方法を見つけましたが、これが最善の方法であるかどうかはわかりません:

var array_old = [{id: "5436",title: "I Like you boy"},{id: "5437",title: "Hello how are you"},{id: "5438",title: "Hello how are you2"}];
var array_new = [{id: "5436",title: "I Like you boy"},{id: "1132",title: "I'm fine"}];

$.each(array_old, function(id, array){

    found = 0;

    $.each(array_new, function(id2, array2) {

        if(array['id']==array2['id'])
        {
            found++;
        }

    });

    if(found==0)
    {
        alert(array['id']+' does not exist in array_new');
    }

});

http://jsfiddle.net/FAb3k/2/

于 2012-11-20T23:57:27.097 に答える
1

配列の大きさによって異なります。よりパフォーマンスの高いソリューションを使用することをお勧めします。

  • 最も簡単な解決策(あなたと@Tebbの両方が見つけた)にはΘ(n*m)
  • これを少し最適化する場合 (要素が [見つからない] 場合に発生 - @gonchuki を参照)、まだO(n*m)
  • 両方の配列が同じ順序であると仮定して、ループを 1 つだけ実行しますO(min(n,m))。その前にそれらをソートする必要がある場合は、O(n*log n+m*log m).
  • ルックアップにハッシュ テーブルを使用するとO(1)、結果がO(n+m). そのために JS オブジェクトを簡単に使用できます。
var counts = {};
for (var i=0; i<array_new.length; i++)
    counts[array_new[i].id] = (counts[array_new[i].id] || 0) + 1;

return array_old.every(function(item) {
    return item.id in counts && counts[item.id]--;
});

(デモ)

于 2012-11-21T00:15:44.610 に答える
0

それが機能し、最終的に読みやすいという理由だけで、野生の代替手段を投入します(パフォーマンスについてはわかりませんが、別の方法を示すために行っているのでスキップしましょう)

var ids_old = $.map(array_old, function(item) { return item.id; });
var ids_new = $.map(array_new, function(item) { return item.id; });

var duplicates = $.grep(ids_old, function(i, id) { 
    return $.inArray(id, ids_new) !== -1;
});

最終結果は、重複した ID 自体のリストを取得することに注意してください。この別の方法では、アイテム自体を収集できます。

var ids_new = $.map(array_new, function(item) { return item.id; });

var duplicates = $.grep(array_old, function(i, item) { 
    return $.inArray(item.id, ids_new) !== -1;
});

ボーナス ポイント:彼の例が純粋な jQuery であっても、ECMAScript5 準拠のブラウザーでは、対応するネイティブ配列を使用して同じ結果を得ることができることに注意してください。

于 2012-11-21T00:21:05.263 に答える