有没有办法用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': 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
所有键的对象,如果一对id
与data2
中的value
相同,则应该使用'EMPTY'
,否则应该成为Object.assign
。或者有没有办法将 class UpdateProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = [
'name',
'age',
]
与某些特殊参数一起使用?
答案 0 :(得分:1)
您可以data2
使用data1
,data2
使用Map
和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'
}));
的可能值。
SELECT t1.id,t1.ip, t2.hostname
FROM
(select id,ip from table_1 LATERAL VIEW explode(ips) ep AS ip) AS t1
LEFT JOIN table_2 AS t2
ON (t2.ip=t1.ip);
答案 1 :(得分:0)
您可以使用Array#find
,Object.assign
和spread properties来完成此操作。通过在value
的第一个参数中指定Object.assign
,您可以设置默认值,以便data2
中的对象覆盖。
var obj = data1.map(obj1 => {
const obj2 = data2.find(obj2 => obj1.id === obj2.id);
return Object.assign({ value: 'EMPTY' }, obj1, obj2);
});
使用apinotes,Object.assign
可以更改为:
{ value: 'EMPTY', ...obj1, ...obj2 }
答案 2 :(得分:0)
这非常适合es6。对于data1 map
,.find
将返回匹配对象(如果存在),否则返回undefined
。将key_s.value
设置为key_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
})
})