比较2个数组以查看是否存在对象

时间:2016-06-30 21:29:27

标签: javascript arrays underscore.js javascript-objects

数组1 = [对象]

数组2 = [对象,对象]

让我们在数组1 对象中说:

 {
   'name': 'apple',
   'id': ''
 }

,在数组2中:

object1:

 {
  'name': 'bananna',
  'id': 2
 }

对象2:

 {
  'name': 'apple',
  'id': 1
 }

我想看看数组1中的对象是否在数组2中,如果是,请将array1&id; id设置为相同的id。它应该返回true或对象本身,然后在数组1中,id应该更改为1.

不要以为我的尝试很快。 btw这两个数组都可以是任何大小。

  var itemFrom1;
  for (var a = 0; a < array1.length; a++) {
    itemFrom1 = array1[a];

    for(var b = 0; b < array2.length; b++) {                               
      if (itemFrom1.name === array2[b].name) {
        itemFrom1.id = array2[b].id;
      }
    }
  }

也许我可以使用underscore.js或更简单的方法。

var matched=_.findWhere(array2,{name:array1.name}) 

注意:需要它适用于所有浏览器。

3 个答案:

答案 0 :(得分:2)

你可以试试这个:

它做的是遍历list1中的每个元素,检查list2中每个元素的名称,并添加匹配的元素。

&#13;
&#13;
var list1 = [
  { name: "apple" },
  { name: "grape" },
  { name: "orange" },
  { name: "watermelon" }
];
var list2 = [
  { name: "apple", id: 1 },
  { name: "grapefruit", id: 2 },
  { name: "grape", id: 3 }
];

for(item in list1) {
  var match = list2.filter(function(obj) {
    return obj.name == list1[item].name;
  })[0] || false;
  if(match)
    list1[item].id = match.id;
}

console.log(list1);
&#13;
&#13;
&#13;

根据您的请求,我tested both of ours on JSFiddle并意识到我的更慢(根据performance.now(),为0.3799999999999386ms而不是0.07999999999998408ms)。糟糕。

你的工作,可能就像你能得到的一样直截了当。我说坚持下去。

答案 1 :(得分:2)

我建议对list1的元素使用哈希表,并将其用作添加id的参考。该提案的复杂度为 O(n + m)

&#13;
&#13;
var list1 = [{ name: "apple" }, { name: "grape" }, { name: "orange" }, { name: "watermelon" }],
    list2 = [{ name: "apple", id: 1 }, { name: "grapefruit", id: 2 }, { name: "grape", id: 3 }],
    hash = Object.create(null);

list1.forEach(function (a) {
    hash[a.name] = a;
});

list2.forEach(function (a) {
    if (hash[a.name]) {
        hash[a.name].id = a.id;
    }
});

console.log(list1);
&#13;
&#13;
&#13;

如果您的用户代理支持,请使用Map

&#13;
&#13;
var list1 = [{ name: "apple" }, { name: "grape" }, { name: "orange" }, { name: "watermelon" }],
    list2 = [{ name: "apple", id: 1 }, { name: "grapefruit", id: 2 }, { name: "grape", id: 3 }],
    map = new Map();

list1.forEach(a => map.set(a.name, a));
list2.forEach(a => (map.get(a.name) || {}).id = a.id);

console.log(list1);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

你的实现没问题,我只想在array2中找到项目时向第二个循环添加break;,否则你将遍历array2中的所有其他项目,想象你正在寻找的项目是第一个,你会迭代下一个N,如果你没有打破第二个for-loop

  var itemFrom1;
  for (var a = 0; a < array1.length; a++) {
    itemFrom1 = array1[a];

    for(var b = 0; b < array2.length; b++) {                               
      if (itemFrom1.name === array2[b].name) {
        itemFrom1.id = array2[b].id;
        break; // Stops the second loop, go on with the next value from array1!
      }
    }
  }
相关问题