ES6特定方法循环遍历两个数组并在每个数组中找到匹配?

JVG*_*JVG 4 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', type: "Echidna"
  },
  {
    name: 'C', type: "Wallaby"
  },
  {
    name: 'D', type: "Rabbit"
  }
]
Run Code Online (Sandbox Code Playgroud)

假装这arr1是旧数据,并且arr2是来自API的更新数据.

我想遍历数组,找到name匹配的对象.如果有匹配,我想更新typefrom arr1arr2.

我这样做是这样的:

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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想知道ECMAScript 6中是否有任何更新的方法可以使这更容易(在现实世界中,逻辑更加复杂,循环中的循环感觉相当笨重);

Ori*_*iol 5

在ES2015中你不会使用这个数据结构,你会使用map:

var map1 = new Map([
  ['A', "Dog"],
  ['B', "Zebra"],
  ['C', "Cat"],
  ['D', "Dingo"]
]);
var map2 = new Map([
  ['A', "Wolf"],
  ['B', "Echidna"],
  ['C', "Wallaby"],
  ['D', "Rabbit"]
]);
Run Code Online (Sandbox Code Playgroud)

然后,要map1使用来自数据的更新map2,您将使用

for(let [key, value] of map2)
  map1.set(key, value);
Run Code Online (Sandbox Code Playgroud)

地图操作平均需要是次线性的.如果使用哈希实现映射,它们应该是常量.那么总成本将是线性的.

或者,由于键是字符串,因此可以考虑使用普通对象.您可以创建它Object.create(null)以防止它继承属性Object.prototype,并为其分配属性Object.assign

var obj1 = Object.assign(Object.create(null), {
  A: "Dog",
  B: "Zebra",
  C: "Cat",
  D: "Dingo"
});
var obj2 = Object.assign(Object.create(null), {
  A: "Wolf",
  B: "Echidna",
  C: "Wallaby",
  D: "Rabbit"
});
Run Code Online (Sandbox Code Playgroud)

然后,要obj1使用来自数据的更新obj2,您将使用

for(let key in obj2)
  obj1[key] = obj2[key];
Run Code Online (Sandbox Code Playgroud)

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

  • @Jascination是的,为什么不呢?地图操作平均需要是次线性的,因此它是一个不错的选择.或者,由于键是字符串,旧的`Object.create(null)`将是一个很好的选择. (2认同)