如何将对象数组展平为每个对象参数的数组?

时间:2015-01-16 21:12:02

标签: javascript jquery arrays underscore.js

我有一个像这样的对象数组:

[
  {
    p1: 1
    p2: 2
  },
  {
    p1: 3
    p2: 4
  }
]

我想将其展平为对象上每个属性的数组(维护顺序):

[1, 3] and [2, 4]

最好将这些内容存储在字典中,并将属性作为密钥:

{
   p1: [1, 3],
   p2: [2, 4]
}

在javascript中有没有非暴力方法吗?我已经在使用jQuery和Underscore.js,如果这些库在这里有任何帮助。

我目前的计划是遍历数组中的所有对象,并手动将每个属性值添加到其对应的数组中。我有兴趣知道是否有更有趣的方式来做这件事。

2 个答案:

答案 0 :(得分:2)

类似的东西:

var result = data.reduce(function(acc, x) {
  Object.keys(x).forEach(function(k) {
    acc[k] = (acc[k] || []).concat([x[k]])
  })
  return acc
},{})

console.log(result)
//^ {
//    p1: [1, 3],
//    p2: [2, 4]
//  }

但请注意,对象键没有顺序,结果取决于每个实现。如果需要特定订单,则可能必须对生成的数组进行排序。

答案 1 :(得分:2)

如果每个对象的属性可靠相同,则可以像这样使用下划线。

var keys = _.keys(arr[0]);

var newObj = _.reduce(keys,function(obj,key){
   obj[key] = _.pluck(arr,key)
},{});
//newObj will now be in the requested format

如果不同对象的属性不同,则需要执行一些额外的逻辑来获取要迭代的完整属性列表。