我有一个对象数组,我想根据它们的键创建另一个对象。例如我有一个数组,如
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。这是什么错误,有人可以帮我吗?
起初看起来可能很吓人。从空对象开始减少数据集。然后从外部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
),
{}
)
)
您可以以最简单的方式尝试这样做。
也可从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 ] }
一种相当干净的方法:
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>