Javascript 优化double for with.map/.filter/.reduce之类的
有没有一种方法可以通过ES5/ES6优化以下内容Javascript 优化double for with.map/.filter/.reduce之类的,javascript,ecmascript-6,ecmascript-5,Javascript,Ecmascript 6,Ecmascript 5,有没有一种方法可以通过ES5/ES6优化以下内容 var obj = []; var set; for (var key_s in data1) { set = false; for (var key_s2 in data2) { if (data1[key_s].id === data2[key_s2].id) { obj.push({'id': data1[key_s].id, 'key':
var obj = [];
var set;
for (var key_s in data1) {
set = false;
for (var key_s2 in data2) {
if (data1[key_s].id === data2[key_s2].id) {
obj.push({'id': data1[key_s].id,
'key': data1[key_s].key,
'value': data2[key_s2].value})
set = true;
break;
}
}
if (!set)
obj.push({'id': data1[key_s].id,
'key': data1[key_s].key,
'value': "EMPTY"})
}
我想要一个对象,它包含data1
的所有键,如果一对具有与data2
中相同的id
,它应该取它的值,否则它应该变成“空”
。或者有没有一种方法可以使用对象。为分配一些特殊的参数或什么?您可以使用data2
和data1
以及data2
的可能值
var map = new Map(data2.map(o => ([o.id, o]))),
obj = data1.map(({ id, key }) => ({ id, key, value: map.has(id)
? map.get(id).value
: 'EMPTY'
}));
var obj = data1.map(obj1 => {
const obj2 = data2.find(obj2 => obj1.id === obj2.id);
return Object.assign({ value: 'EMPTY' }, obj1, obj2);
});
你可以用,和。通过在Object.assign
的第一个参数中指定值
,您可以从数据2
中设置默认值以被对象覆盖
var map = new Map(data2.map(o => ([o.id, o]))),
obj = data1.map(({ id, key }) => ({ id, key, value: map.has(id)
? map.get(id).value
: 'EMPTY'
}));
var obj = data1.map(obj1 => {
const obj2 = data2.find(obj2 => obj1.id === obj2.id);
return Object.assign({ value: 'EMPTY' }, obj1, obj2);
});
使用,可以将对象.assign
更改为:
{ value: 'EMPTY', ...obj1, ...obj2 }
这是一个非常简单的es6'ed。map
over data1,.find
将返回匹配对象(如果存在),否则返回未定义的。将key\u.value
设置为key\u s2
值或“EMPTY”
,然后返回key\s对象。您将得到一个对象数组。这假设data1和data2是对象数组,这就是您的示例的编写方式,因此我认为情况就是这样
let obj = data1.map(key_s => {
let newValue = data2.find(key_s2 => key_s.id === key_s2.id)
key_s.value = newValue ? newValue.value : "EMPTY"
return key_s
})
})
优化在什么意义上?效率?可读性?请同时添加data1
和data2
以及想要的结果。data1
和data2
都是数组吗?首先,您可以从data2
的对象中添加一些其他(不需要的)属性…@NinaScholz这是真的。我只是假设不会有其他的财产,或者这不重要。我更喜欢您的解决方案,因为它不会每次迭代data2
。