将对象数组中的多个属性映射到同一个数组

时间:2017-04-17 15:47:53

标签: javascript arrays

我有一个对象数组:

let objArray = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}]

我希望将ab属性映射到单个数组:

[1, 2, 3, 4, 5, 6] //single array with a and b together

我可以这样做:

[...objArray.map(d => d.a), ...objArray.map(d => d.b)]

但是我想避免多次遍历objArray

7 个答案:

答案 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,以及将为数组中的每个项调用的迭代函数。在该函数中,您可以使用数组项修改累加器。

因此,对于您的情况,您可以将累加器设为空数组[],然后推送项目的ab属性...

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#concatArray#mapObject.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)