【问题标题】:Using rest/spread syntax to merge an array of objects into a single object使用 rest/spread 语法将对象数组合并为单个对象
【发布时间】:2019-07-19 22:22:44
【问题描述】:

这段代码按预期工作;但是,对于任何类型的输入,它都不是可扩展的:

const input = [{optionA: {a: 1}, optionB: {b: 1}, optionC: {c: 1}];
input.map(({optionA, optionB, optionC}) => {
    return Object.assign({}, optionA, optionB, optionC);
});

问题:当输入键的名称和长度未知时,如何重构我的地图参数和我的 Object.assign 参数以不使用解构而是使用 javascript 的扩展语法来确保输出?

我怎样才能满足这些测试用例?

    const input2 = [{optionZ: {z: 1}, optionY: {y: 1}, optionX: {x: 1}];
    const input3 = [{optionA: {a: 1}, optionB: {b: 1}, optionC: {c: 1},{optionZ: {z: 1}, optionY: {y: 1}, optionX: {x: 1}];

    input2.map(({optionA, optionB, optionC}) => {
        return Object.assign({}, optionA, optionB, optionC);
    });
    input3.map(({optionA, optionB, optionC}) => {
        return Object.assign({}, optionA, optionB, optionC);
    });

【问题讨论】:

    标签: javascript ecmascript-6 parameters spread


    【解决方案1】:

    在这种情况下,对象传播将不起作用,因为结果将是具有属性的新对象,而不是您要合并的值的列表。

    使用Object.values() 获取属性值,然后将它们与Object.assign() 合并:

    const fn = obj => Object.assign({}, ...Object.values(obj));
    
    const input2 = [{"optionZ":{"z":1},"optionY":{"y":1},"optionX":{"x":1}}];
    const input3 = [{"optionA":{"a":1},"optionB":{"b":1},"optionC":{"c":1}},{"optionZ":{"z":1},"optionY":{"y":1},"optionX":{"x":1}}];
    
    console.log(input2.map(fn));
    console.log(input3.map(fn));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-08
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多