使用rest / spread语法将对象数组合并为单个对象

时间:2019-07-19 22:22:44

标签: javascript ecmascript-6 parameters spread

这部分代码按预期工作;但是,它不是任何输入的scalabe:

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

问题:当输入键的名称和长度未知时,如何重构地图的args和Object.assign的args而不使用解构,而是使用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);
    });

1 个答案:

答案 0 :(得分:0)

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

使用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));