使用.map / .filter / .reduce或其他东西优化double

时间:2017-10-10 19:22:31

标签: 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': 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所有键的对象,如果一对iddata2中的value相同,则应该使用'EMPTY' ,否则应该成为Object.assign。或者有没有办法将 class UpdateProfileSerializer(serializers.ModelSerializer): class Meta: model = Profile fields = [ 'name', 'age', ] 与某些特殊参数一起使用?

3 个答案:

答案 0 :(得分:1)

您可以data2使用data1data2使用Mapvar 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#findObject.assignspread 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);
});

使用apinotesObject.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
 })
})