Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 比较两个数组以查看对象是否存在_Javascript_Arrays_Underscore.js_Javascript Objects - Fatal编程技术网

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

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 别以为我的尝试很快。顺便说一句

数组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

别以为我的尝试很快。顺便说一句,两个阵列可以是任意大小

  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!
      }
    }
  }