根据对象数组中的键创建对象

问题描述 投票:0回答:3

我有一个对象数组,我想根据它们的键创建另一个对象。例如我有一个数组,如

var arr = [{1: 36011, 2: 18320, 3: 36011, 4: 10570},
            {1: 19754, 2: 6722, 3: 19754, 4: 6699},
            {1: 15711, 2: 10039, 3: 15711, 4: 4172}]

而且我希望我的结果数组为

var result = {1:[36011,19754,15711], 2:[18320,6722,10039],..}

[我被建议使用lodash,我是新手,所以我尝试使用reduce

var i = 1, new_arr = {};
_.reduce(arr, function(key, val){
     new_arr[i++] = temp1.key 
return new_arr;
},{})

我将得到的值为undefined。这是什么错误,有人可以帮我吗?

javascript arrays lodash
3个回答
1
投票

起初看起来可能很吓人。从空对象开始减少数据集。然后从外部reduce的结果开始减少每一行,并以到目前为止的结果为基础。

const data = [
  {1: 36011, 2: 18320, 3: 36011, 4: 10570},
  {1: 19754, 2: 6722, 3: 19754, 4: 6699},
  {1: 15711, 2: 10039, 3: 15711, 4: 4172}
]

console.log(
  data.reduce(
    (result, row) => Object.entries(row).reduce(
      (_result, [k, v]) => ({
        ..._result, 
        [k]: [...(_result[k] || []), v] 
      }),
      result
    ),
    {}
  )
)

0
投票

您可以以最简单的方式尝试这样做。

也可从https://rextester.com/IPI35964在线获得,以尝试查看输出。

var arr = [{1: 36011, 2: 18320, 3: 36011, 4: 10570},
        {1: 19754, 2: 6722, 3: 19754, 4: 6699},
        {1: 15711, 2: 10039, 3: 15711, 4: 4172}]

var output = {}
for(var obj of arr){
    for(var key in obj){
        if(key in output){
            output[key].push(obj[key])
        } else {
            output [key] = [obj[key]]
        }
    }
}
console.log(output)

输出

{ '1': [ 36011, 19754, 15711 ],
  '2': [ 18320, 6722, 10039 ],
  '3': [ 36011, 19754, 15711 ],
  '4': [ 10570, 6699, 4172 ] }

0
投票

一种相当干净的方法:

  • 创建一个大的键值对数组
  • 按键对将这些键值对分组
  • 从分组的键值对中提取值

var arr = [
  { 1: 36011, 2: 18320, 3: 36011, 4: 10570 },
  { 1: 19754, 2: 6722, 3: 19754, 4: 6699 },
  { 1: 15711, 2: 10039, 3: 15711, 4: 4172 }
]

// Get one big array of all key-value pairs
var pairs = _.flatMap(arr, _.entries);

// Group by the keys (index 0 of the pairs)
var groups = _.groupBy(pairs, '0');

// Extract the values
var final = _.mapValues(groups, g => _.map(g, '1'));

//console.log(pairs);
console.log(final);


// Using chaining:
var final2 = _.chain(arr)
  .flatMap(_.entries)
  .groupBy('0')
  .mapValues(g => _.map(g, '1'));

console.log(final2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
© www.soinside.com 2019 - 2024. All rights reserved.