数组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})
注意:需要它适用于所有浏览器。
答案 0 :(得分:2)
你可以试试这个:
它做的是遍历list1
中的每个元素,检查list2
中每个元素的名称,并添加匹配的元素。
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;
根据您的请求,我tested both of ours on JSFiddle并意识到我的多更慢(根据performance.now()
,为0.3799999999999386ms而不是0.07999999999998408ms)。糟糕。
你的工作,可能就像你能得到的一样直截了当。我说坚持下去。
答案 1 :(得分:2)
我建议对list1
的元素使用哈希表,并将其用作添加id
的参考。该提案的复杂度为 O(n + m)。
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;
如果您的用户代理支持,请使用Map。
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;
答案 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!
}
}
}