Javascript 比较两个数组以查看对象是否存在
数组1=[对象] 数组2=[对象,对象] 假设数组中的1对象是:Javascript 比较两个数组以查看对象是否存在,javascript,arrays,underscore.js,javascript-objects,Javascript,Arrays,Underscore.js,Javascript Objects,数组1=[对象] 数组2=[对象,对象] 假设数组中的1对象是: { 'name': 'apple', 'id': '' } 在数组2中: 目标1: { 'name': 'bananna', 'id': 2 } 目标2: { 'name': 'apple', 'id': 1 } 我想看看数组1中的对象是否在数组2中,如果是,请将数组1的id设置为相同的id。它应该返回true或对象本身,然后在数组1中,id应该更改为1 别以为我的尝试很快。顺便说一句
{
'name': 'apple',
'id': ''
}
在数组2中:
目标1:
{
'name': 'bananna',
'id': 2
}
目标2:
{
'name': 'apple',
'id': 1
}
我想看看数组1中的对象是否在数组2中,如果是,请将数组1的id设置为相同的id。它应该返回true或对象本身,然后在数组1中,id应该更改为1
别以为我的尝试很快。顺便说一句,两个阵列可以是任意大小
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;
}
}
}
注意:所有浏览器都需要此选项。您可以尝试以下选项:
它所做的是遍历列表1中的每个元素,对照列表2中的每个元素检查名称,并在列表中添加匹配元素的ID
变量列表1=[
{名称:苹果},
{名称:葡萄},
{name:orange},
{名称:西瓜}
];
变量列表2=[
{name:apple,id:1},
{姓名:葡萄柚,id:2},
{姓名:grape,id:3}
];
foritem在列表1中{
var match=list2.filterfunctionobj{
返回obj.name==list1[item].name;
}[0]| |假;
ifmatch
列表1[项目].id=match.id;
}
console.loglist1 您可以尝试以下方法:
它所做的是遍历列表1中的每个元素,对照列表2中的每个元素检查名称,并在列表中添加匹配元素的ID
变量列表1=[
{名称:苹果},
{名称:葡萄},
{name:orange},
{名称:西瓜}
];
变量列表2=[
{name:apple,id:1},
{姓名:葡萄柚,id:2},
{姓名:grape,id:3}
];
foritem在列表1中{
var match=list2.filterfunctionobj{
返回obj.name==list1[item].name;
}[0]| |假;
ifmatch
列表1[项目].id=match.id;
}
console.loglist1 我建议对列表1的元素使用哈希表,并将其用作添加id的参考。此建议的复杂性为On+m var list1=[{name:apple},{name:grape},{name:orange},{name:西瓜}], 列表2=[{name:apple,id:1},{name:grapecit,id:2},{name:grape,id:3}], hash=Object.createnull; 列表1.a函数{ hash[a.name]=a; }; 列表2.a函数{ 如果散列[a.名称]{ hash[a.name].id=a.id; } };
console.loglist1 我建议对列表1的元素使用哈希表,并将其用作添加id的参考。此建议的复杂性为On+m var list1=[{name:apple},{name:grape},{name:orange},{name:西瓜}], 列表2=[{name:apple,id:1},{name:grapecit,id:2},{name:grape,id:3}], hash=Object.createnull; 列表1.a函数{ hash[a.name]=a; }; 列表2.a函数{ 如果散列[a.名称]{ hash[a.name].id=a.id; } };
console.loglist1 您的实现是好的,我只想添加一个中断;当在array2中找到该项时,将循环到第二个循环,否则您将迭代array2中的所有其他项,假设您要查找的项是第一个,如果不中断第二个for循环,您将迭代到下一个N
您的实现是好的,我只想添加一个中断;当在array2中找到该项时,将循环到第二个循环,否则您将迭代array2中的所有其他项,假设您要查找的项是第一个,如果不中断第二个for循环,您将迭代到下一个N
那个走失的美元符号在那里干什么?你在检查相同的标记。。。也就是说,您正在检查array1的第一个元素是否与array2的第一个元素同名。然后你将检查第二个元素是否与第二个元素匹配,依此类推。@JimNastos是的,我意识到了,所以我该如何修复它,因为我的方法是错误的。索引可以是不同的。Jim说,你需要两个嵌套的循环,而不是一个循环。对于A中的每一个元素,你需要将它与B中的每一个元素进行比较。@JosephYoung是这样吗?那个零散的美元符号在那里做什么?你在检查相同的标记。。。也就是说,您正在检查array1的第一个元素是否与array2的第一个元素同名。然后你将检查第二个元素是否与第二个元素匹配,依此类推。@JimNastos是的,我意识到了,所以我该如何修复它,因为我的方法是错误的。索引可以是不同的。Jim说,你需要两个嵌套的循环,而不是一个循环。对于A中的每个元素,您需要将其与B中的每个元素进行比较。@JosephYoung这样?您不需要在列表1中定义id吗?另外,这将把grape设置为id 2,apple设置为id 1,在列表1中,对吗?而且,这比我现在使用的2 for循环快吗?@Angular您不需要在列表1中定义id属性,除非您想要一种默认值,以防列表2中没有匹配项。是的,grape的id将被设置为2,apple的id将被设置为1。你可以通过运行代码片段看到这一点。就速度而言,@Angular,我不确定速度的差异。我现在就去看看。你不需要在列表1中定义id吗?还有,这将把grape设置为id 2,apple设置为id 1,在列表1中,对吗?还有,这比我现在的2个for循环快吗?@Angular你不知道吗
除非您想要一种默认值,以防列表2中没有匹配项,否则最好在列表1中定义id属性。是的,grape的id将被设置为2,apple的id将被设置为1。你可以通过运行代码片段看到这一点。就速度而言,@Angular,我不确定速度的差异。我现在来看看。为什么使用散列对象而不是散列映射?这是为了兼容性吗?@mortezaT,实际上Object比Map更可靠。你的答案太宽泛了。如果你有任何解释的答案,你可以发送链接吗?@mortezaT,请查看地图兼容性不太好。为什么使用哈希对象而不是哈希地图?这是为了兼容性吗?@mortezaT,实际上Object比Map更可靠。你的答案太宽泛了。如果你有任何答案,你解释了这一点,你可以发送链接吗?@mortezaT,请查看地图兼容性不太好。
var matched=_.findWhere(array2,{name:array1.name})
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!
}
}
}