代码之家  ›  专栏  ›  技术社区  ›  Armeen Moon

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

  •  0
  • Armeen Moon  · 技术社区  · 6 年前

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

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

    问题:如何重构映射的参数和对象。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);
        });
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Ori Drori    6 年前

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

    使用 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));
    推荐文章