【问题标题】:Optimization of double for with .map / .filter / .reduce or something使用 .map / .filter / .reduce 优化双精度
【发布时间】:2017-10-10 19:22:30
【问题描述】:

有没有办法用 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 与一些特殊参数或其他东西一起使用?

【问题讨论】:

标签: javascript ecmascript-6 ecmascript-5


【解决方案1】:

您可以将Map 用于data2,并将Array#mapdata1data2 的可能值一起使用。

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'
    }));

【讨论】:

    【解决方案2】:

    这是相当 es6 的。 map 在 data1 上,.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
     })
    })
    

    【讨论】:

      【解决方案3】:

      您可以使用 Array#mapArray#findObject.assign 来实现。通过在Object.assign 的第一个参数中指定value,您可以设置一个默认值以被来自data2 的对象覆盖。

      var obj = data1.map(obj1 => {
        const obj2 = data2.find(obj2 => obj1.id === obj2.id);
        return Object.assign({ value: 'EMPTY' }, obj1, obj2);
      });
      

      使用spread properties,可以将Object.assign更改为:

      { value: 'EMPTY', ...obj1, ...obj2 }
      

      【讨论】:

      • 您可以从data2 的对象中添加一些其他(不需要的)属性...
      • @NinaScholz 是的。我只是假设不会有其他属性,或者这无关紧要。我更喜欢您的解决方案,因为它不会每次都迭代 data2
      猜你喜欢
      • 2021-06-06
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 2017-08-23
      相关资源
      最近更新 更多