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 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道ECMAScript 6中是否有任何更新的方法可以使这更容易(在现实世界中,逻辑更加复杂,循环中的循环感觉相当笨重);
在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)
很可能该对象将使用散列实现,因此每个赋值平均将是常量.总成本是线性的.
| 归档时间: |
|
| 查看次数: |
2161 次 |
| 最近记录: |