1

我有两个数组:

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 在 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)
  • 如果您对此进行一些优化(如果您没有 [not] 找到该元素,则中断 - 请参阅@gonchuki),您仍然处于O(n*m)
  • 您可以假设两个数组的顺序相同,并且只运行一个循环: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 回答