我有一个对象数组:
let objArray = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}]
我希望将a
和b
属性映射到单个数组:
[1, 2, 3, 4, 5, 6] //single array with a and b together
我可以这样做:
[...objArray.map(d => d.a), ...objArray.map(d => d.b)]
但是我想避免多次遍历objArray
。
答案 0 :(得分:1)
您可以映射objArray
以获取值,但最终会得到一个嵌套数组:[[1,2],[3,4],[5,6]]
。使用apply
将嵌套数组作为属性传递给concat
以连接成单个数组。
var objArray = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6, c: 7}];
var reducedArray = [].concat.apply([], objArray.map(Object.values));
console.log(reducedArray);
或者使用ES6,您可以使用扩展运算符...
而不是将属性数组传递给concat,然后您不需要使用apply
,因为扩展运算符将展开嵌套数组到单个属性中。
const objArray = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6, c: 7}];
const reducedArray = [].concat(...objArray.map(Object.values));
console.log(reducedArray);
Object.values
将允许map
函数处理任意数量的值。感谢Object.values
想法的Nina Scholz in this answer。
注意:这两种方法仅适用于嵌套单层深度的数组。
答案 1 :(得分:1)
您可以使用我最喜欢的数组迭代器array.reduce()
。
它接受"累积器" value,以及将为数组中的每个项调用的迭代函数。在该函数中,您可以使用数组项修改累加器。
因此,对于您的情况,您可以将累加器设为空数组[]
,然后推送项目的a
和b
属性...
var objArray = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}];
var result = objArray.reduce(function(acc, obj) {
acc.push(obj.a);
acc.push(obj.b);
return acc;
}, []);
或与ES6
var objArray = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}];
var result = objArray.reduce((acc, { a, b }) => [ ...acc, a, b ]), []);
有关详细信息,请参阅https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
答案 2 :(得分:0)
您可以将Array#concat
,Array#map
和Object.values
用于任意数量的属性。
var objArray = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}],
result = [].concat(...objArray.map(Object.values));
console.log(result);

答案 3 :(得分:0)
let objArray = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}];
var newArray = [];
objArray.forEach(function(obj) {
newArray.push(obj.a, obj.b);
});
答案 4 :(得分:0)
我会使用可重复使用的生成器函数,如下所示:
// Flatten objects to their values:
function* flatten(objects) {
for (let obj of objects) yield* Object.values(obj);
}
// Example:
let objects = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}];
console.log([...flatten(objects)]);
答案 5 :(得分:0)
只是为了各种各样;
var objArray = [{a: 1, b: 2}, {a: 3, b: 4, c: 7}, {a: 5, b: 6}],
flatObj = a => a.length ? Object.values(a[0]).concat(flatObj(a.slice(1))) : [];
console.log(flatObj(objArray));

答案 6 :(得分:0)
我会遵循 danbahrami 的代码,但可能会在对象可能不包含 a 或 b 的情况下添加一个过滤器。
var objArray = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, c: 6}];
var result = objArray.reduce((acc, { a, b }) => [ ...acc, a, b ], []).filter(i => i);
console.log(result)