将包含对象的数组展平为 1 个对象
Flatten array with objects into 1 object
给定输入:
[{ a: 1 }, { b: 2 }, { c: 3 }]
如何return:
{ a: 1, b: 2, c: 3 }
对于带有 lodash 的数组 it's not a problem 但这里我们有对象数组。
let merged = Object.assign(...arr); // ES6 (2015) syntax
var merged = Object.assign.apply(Object, arr); // ES5 syntax
请注意,Object.assign
尚未在许多环境中实现,您可能需要对其进行 polyfill(使用 core-js、其他 polyfill 或使用 MDN 上的 polyfill)。
您提到了 lodash,因此值得指出的是,它带有一个 _.assign
函数来实现同样的目的:
var merged = _.assign.apply(_, [{ a: 1 }, { b: 2 }, { c: 3 }]);
但我真的很推荐新的标准库方式。
这里是一个没有使用 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);
fiddle: http://jsfiddle.net/yaw3wbb8/
您可以像这样使用 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 } ]
我有一个不需要 polyfill 的简洁的小解决方案。
var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var object = {};
arr.map(function(obj){
var prop = Object.getOwnPropertyNames(obj);
object[prop] = obj[prop];
});
希望对您有所帮助:)
对于lodash,你可以使用merge():
var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ];
_.merge.apply(null, [{}].concat(arr));
// → { a: 1, b: 2, c: 3 }
如果您在多个地方这样做,您可以使用 partial() and spread():
让 merge()
更优雅一点
var merge = _.spread(_.partial(_.merge, {}));
merge(arr);
// → { a: 1, b: 2, c: 3 }
下面是 Object.assign
与 array.prototype.reduce
函数的一个很好的用法:
let merged = arrOfObjs.reduce((accum, val) => {
Object.assign(accum, val);
return accum;
}, {})
这种方法不会改变对象的输入数组,这可以帮助您避免难以解决的问题。
您可以轻松地将对象扁平化为数组。
function flatten(elements) {
return elements.reduce((result, current) => {
return result.concat(Array.isArray(current) ? flatten(current) : current);
}, []);
};
在已接受的答案中添加 运行 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))
问这个问题 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];
})
给定输入:
[{ a: 1 }, { b: 2 }, { c: 3 }]
如何return:
{ a: 1, b: 2, c: 3 }
对于带有 lodash 的数组 it's not a problem 但这里我们有对象数组。
let merged = Object.assign(...arr); // ES6 (2015) syntax
var merged = Object.assign.apply(Object, arr); // ES5 syntax
请注意,Object.assign
尚未在许多环境中实现,您可能需要对其进行 polyfill(使用 core-js、其他 polyfill 或使用 MDN 上的 polyfill)。
您提到了 lodash,因此值得指出的是,它带有一个 _.assign
函数来实现同样的目的:
var merged = _.assign.apply(_, [{ a: 1 }, { b: 2 }, { c: 3 }]);
但我真的很推荐新的标准库方式。
这里是一个没有使用 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);
fiddle: http://jsfiddle.net/yaw3wbb8/
您可以像这样使用 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 } ]
我有一个不需要 polyfill 的简洁的小解决方案。
var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var object = {};
arr.map(function(obj){
var prop = Object.getOwnPropertyNames(obj);
object[prop] = obj[prop];
});
希望对您有所帮助:)
对于lodash,你可以使用merge():
var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ];
_.merge.apply(null, [{}].concat(arr));
// → { a: 1, b: 2, c: 3 }
如果您在多个地方这样做,您可以使用 partial() and spread():
让merge()
更优雅一点
var merge = _.spread(_.partial(_.merge, {}));
merge(arr);
// → { a: 1, b: 2, c: 3 }
下面是 Object.assign
与 array.prototype.reduce
函数的一个很好的用法:
let merged = arrOfObjs.reduce((accum, val) => {
Object.assign(accum, val);
return accum;
}, {})
这种方法不会改变对象的输入数组,这可以帮助您避免难以解决的问题。
您可以轻松地将对象扁平化为数组。
function flatten(elements) {
return elements.reduce((result, current) => {
return result.concat(Array.isArray(current) ? flatten(current) : current);
}, []);
};
在已接受的答案中添加 运行 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))
问这个问题 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];
})