关于javascript:使用jQuery比较数组

Compare arrays with jQuery

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
Simplest code for array intersection in javascript
How to merge two arrays in Javascript

有三个数组:

1
2
3
var items = Array(523,3452,334,31,5346);
var items_used = Array(3452,31,4123);
var items_new = Array();

第一个是通用的,第二个是当前使用的物品。第三个包含第一个数组中的所有项,第二个数组中没有提到witch。

如何从第一个数组项中移除,在第二个数组中使用witch,并将结果写入第三个数组?

我们应该得到items_new = Array(523, 334, 5346)。删除345231,因为它们在第二个数组中被提到。


你可以这样做:

1
2
3
4
5
6
7
8
var items = Array(523,3452,334,31,5346);
var items_used = Array(3452,31,4123);
var items_compared = Array();

    $.each(items, function(i, val){
      if($.inArray(val, items_used) < 0)
          items_compared.push(val);
    });

就这样


为什么不简单的for循环呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(var j = 0; j < items.length; j++)
{
    var found = false;
    for(var k = 0; k < items_used.length; k++)
    {
       if(items_used[k] == items[j])
       {
           found = true;
           break;
       }
    }

    if(!found)
       items_compared.push(items[j]);
}


作为更快的解决方案,可能:

1
2
3
4
5
6
7
8
9
10
11
12
var j, itemsHash = {};
for (j = 0; j < items.length; j++) {
  itemsHash[items[j]] = true;
}
for (j = 0; j < itemsUsed.length; j++) {
  itemsHash[itemsUsed[j]] = false;
}
for (j in itemsHash) {
   if (itemsHash[j]) {
     itemsCompared.push(j);
   }
}

在O(N)时间内运行,内存多一点。


基本上,我会让第三个元素在第一个元素中,然后循环使用第二个数组,删除在第一个元素中找到的所有元素。

1
2
3
4
5
6
7
var items_compared = items;
for(int i = 0; i < items_used.length; ++i)
{
    var indx = $.inArray(items_used[i], items_compared);
    if(indx != -1)
        items_compared.splice(indx, 1);
}