Flatten array with objects into 1 object

前端 未结 8 1495
情歌与酒
情歌与酒 2020-12-03 09:41

Given input:

[{ a: 1 }, { b: 2 }, { c: 3 }]

How to return:

{ a: 1, b: 2, c: 3 }

For arrays it\'s not a pr

相关标签:
8条回答
  • 2020-12-03 10:15

    Here is a nice usage of Object.assign with the array.prototype.reduce function:

    let merged = arrOfObjs.reduce((accum, val) => {
      Object.assign(accum, val);
      return accum;
    }, {})
    

    This approach does not mutate the input array of objects, which could help you avoid difficult to troubleshoot problems.

    0 讨论(0)
  • 2020-12-03 10:21

    Use Object.assign:

    let merged = Object.assign(...arr); // ES6 (2015) syntax
    
    var merged = Object.assign.apply(Object, arr); // ES5 syntax
    

    Note that Object.assign is not yet implemented in many environment and you might need to polyfill it (either with core-js, another polyfill or using the polyfill on MDN).

    You mentioned lodash, so it's worth pointing out it comes with a _.assign function for this purpose that does the same thing:

     var merged = _.assign.apply(_, [{ a: 1 }, { b: 2 }, { c: 3 }]);
    

    But I really recommend the new standard library way.

    0 讨论(0)
  • 2020-12-03 10:29

    I've got a neat little solution not requiring a polyfill.

    var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
    var object = {};
    
    arr.map(function(obj){
        var prop = Object.getOwnPropertyNames(obj);
        object[prop] = obj[prop];
    });
    

    Hope that helps :)

    0 讨论(0)
  • 2020-12-03 10:32

    You can easily flat your object to array.

    function flatten(elements) {
      return elements.reduce((result, current) => {
        return result.concat(Array.isArray(current) ? flatten(current) : current);
      }, []);
    };
    
    0 讨论(0)
  • 2020-12-03 10:33

    Adding to the accepted answer, a running code snippet with ES6.

    let input = [{ a: 1 }, { b: 2 }, { c: 3 }]
    //Get input object list with spread operator
    console.log(...input)
    //Get all elements in one object
    console.log(Object.assign(...input))

    0 讨论(0)
  • 2020-12-03 10:34

    Here is a version not using ES6 methods...

    var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
    var obj = {};
    
    for(var i = 0; i < arr.length; i++) {
        var o = arr[i];
        for(var key in o) {
            if(typeof o[key] != 'function'){
                obj[key] = o[key];
            }
        }
    }
    
    console.log(obj);
    

    fiddle: http://jsfiddle.net/yaw3wbb8/

    0 讨论(0)
提交回复
热议问题