将具有对象的数组展平为1个对象

时间:2015-06-30 10:58:53

标签: javascript lodash flatten

给定输入:

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

如何返回:

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

对于带有lodash的数组it's not a problem,但在这里我们有对象数组。

9 个答案:

答案 0 :(得分:46)

使用Object.assign

let merged = Object.assign(...arr); // ES6 (2015) syntax

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

请注意,Object.assign尚未在许多环境中实现,您可能需要对其进行填充(使用core-js,另一个polyfill或使用MDN上的polyfill)。

你提到了lodash,所以值得一提的是它附带了一个_.assign函数用于此目的:

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

但我真的推荐新的标准库方式。

答案 1 :(得分:5)

使用lodash,您可以使用merge()

var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ];
_.merge.apply(null, [{}].concat(arr));
// → { a: 1, b: 2, c: 3 }

如果您在多个地方执行此操作,可以使用partial()spread()使merge()更加优雅:

var merge = _.spread(_.partial(_.merge, {}));
merge(arr);
// → { a: 1, b: 2, c: 3 }

答案 2 :(得分:4)

这是一个不使用ES6方法的版本......

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

小提琴:http://jsfiddle.net/yaw3wbb8/

答案 3 :(得分:4)

您可以使用下面的underscore.extend函数:

var _ = require('underscore');
var a = [{ a: 1 }, { b: 2 }, { c: 3 }];

var result = _.extend.apply(null, a);
console.log(result); // { a: 1, b: 2, c: 3 }
console.log(a); // [ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ]

为防止修改原始数组,您应该使用

var _ = require('underscore');
var a = [{ a: 1 }, { b: 2 }, { c: 3 }];

var result = _.extend.apply(null, [{}].concat(a));
console.log(result); // { a: 1, b: 2, c: 3 }
console.log(a); // [ { a: 1 }, { b: 2 }, { c: 3 } ]

Here can test it

答案 4 :(得分:1)

我有一个简洁的小解决方案,不需要填充。

var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var object = {};

arr.map(function(obj){
    var prop = Object.getOwnPropertyNames(obj);
    object[prop] = obj[prop];
});

希望有所帮助:)

答案 5 :(得分:0)

Object.assign函数中很好地使用了array.prototype.reduce

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

这种方法不会突变对象的输入数组,这可以帮助您避免难以解决的问题。

答案 6 :(得分:0)

您可以轻松地将对象平整为阵列。

function flatten(elements) {
  return elements.reduce((result, current) => {
    return result.concat(Array.isArray(current) ? flatten(current) : current);
  }, []);
};

答案 7 :(得分:0)

除了已接受的答案外,还有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))

答案 8 :(得分:-1)

在提出这个问题 6 年后。

Object.assign 是我最喜欢的答案(以上)。

但这也合法吗?

let res = {};
[{ a: 1 }, { b: 2 }, { c: 3 }].forEach(val => {
    let key = Object.keys(val);
    console.log(key[0]);
    res[key] = val[key];
})