Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.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 ES6循环两个数组并在每个数组中查找匹配项的特定方法?_Javascript_Performance_Ecmascript 6 - Fatal编程技术网

Javascript ES6循环两个数组并在每个数组中查找匹配项的特定方法?

Javascript ES6循环两个数组并在每个数组中查找匹配项的特定方法?,javascript,performance,ecmascript-6,Javascript,Performance,Ecmascript 6,假设我有两个要比较的对象数组: var arr1 = [ { name: 'A', type: "Dog" }, { name: 'B', type: "Zebra" }, { name: 'C', type: "Cat" }, { name: 'D', type: "Dingo" } ] var arr2 = [ { name: 'A', type: "Wolf" }, { name: 'B', ty

假设我有两个要比较的对象数组:

var arr1 = [
  {
    name: 'A', type: "Dog"
  },
  {
    name: 'B', type: "Zebra"
  },
  {
    name: 'C', type: "Cat"
  },
  {
    name: 'D', type: "Dingo"
  }
]

var arr2 = [
  {
    name: 'A', type: "Wolf"
  },
  {
    name: 'B', type: "Echidna"
  },
  {
    name: 'C', type: "Wallaby"
  },
  {
    name: 'D', type: "Rabbit"
  }
]
假设
arr1
是旧数据,
arr2
是来自API的更新数据

我想在数组中循环,查找
name
匹配的对象。如果存在匹配项,我想将
类型
arr1
更新为
arr2

我会这样做:

for(var i = 0; i<arr1.length; i++){
  for(var x = 0; x<arr2.length; x++){
    if(arr1[i].name === arr2[x].name){
      arr1[i].type = arr2[x].type;
    }
  }
}

for(var i=0;i您可以使用forEach循环(ES5)或来自ES6的for..of循环:

for (let item1 of arr1) {
  for (let item2 of arr2) {
    if(item1.name === item2.name){
      item1.type = item2.type;
    }
  }
}

如果这些列表很长,我建议将更新后的列表放入哈希映射,这样您的时间复杂度是线性的而不是二次的。

在ES2015中,您不会使用此数据结构,您可以使用:

然后,要使用
map2
中的数据更新
map1
,您可以使用

for(let [key, value] of map2)
  map1.set(key, value);
for(let key in obj2)
  obj1[key] = obj2[key];
映射操作平均要求是次线性的。如果映射是用哈希实现的,则它们应该是常量。那么总成本将是线性的

P>可选地,因为键是字符串,所以可以考虑使用一个纯对象。您可以创建它,以防止它从<代码>对象>原型< /COD>继承属性,并将属性赋值为

。 然后,要使用来自
obj2
的数据更新
obj1
,可以使用

for(let [key, value] of map2)
  map1.set(key, value);
for(let key in obj2)
  obj1[key] = obj2[key];

最有可能的是,对象将使用散列实现,因此每个赋值平均都是常量。总成本将是线性的。

findIndex
所有对象都有不同的名称吗?@Oriol是的,
名称
是唯一的标识符。有时
arr2
将引入
arr1
中没有的名称,这将需要插入。如果名称是唯一标识符,则您可能应该将其用作对象中的键,以便始终进行固定时间查找,而不必遍历两个数组来查找匹配项。即使是在更复杂的对象数组中?(真实世界中的数据具有更多的键和值)。这个问题比试图应用于我自己的用例更粗略/一般,但我也对现实世界中的工作方式感兴趣。@Jascination是的,为什么不呢?映射操作要求平均为次线性,所以这是一个不错的选择。或者,因为键是字符串,所以旧的
Object.create(null)
将是一个很好的选择。我认为您需要添加一个
if(map1.has(key))
/
if(key in obj2)
条件来准确地填充OPrequirements@BergiOP“有时
arr2
会引入不在
arr1
中的名称,需要插入”,所以不需要检查。@Oriol:啊,我明白了-这与他使用的嵌套循环不同。