我有一个对象数组,我正在努力想出一种更好的方法将它映射到两个新数组:一个包含唯一代码值的列表,另一个包含每个代码的出现次数.
注意:结果数组的顺序很重要。例如data[1]应该是labels[1]出现的次数。
这是我目前所拥有的,但我似乎无法找到一种没有多个循环的方法......
var objs = [{
code: 200,
message: 'a'
},
{
code: 300,
message: 'b'
},
{
code: 200,
message: 'c'
},
{
code: 400,
message: 'd'
},
{
code: 200,
message: 'e'
},
];
var data = [];
var labels = [];
var bins = objs
.reduce((codes, obj) => {
let key = obj.code;
codes[key] ? codes[key]++ : codes[key] = 1;
return codes;
}, {});
for (var prop in bins) {
if (!bins.hasOwnProperty(prop))
continue;
labels.push(prop);
data.push(bins[prop]);
}
console.log('data', data); // [3, 1, 1]
console.log('labels', labels); // ['200', '300', '400']
最佳答案
您可以使用 reduce对象数组到 Map , 然后提取 values和 keys成数组:
const values = [{ code: 200, message: 'a' }, { code: 300, message: 'b' }, { code: 200, message: 'c' }, { code: 400, message: 'd' }, { code: 200, message: 'e' }];
const counts = values.reduce((m, { code }) => m.set(code, (m.get(code) || 0) + 1), new Map());
const data = [...counts.values()];
const label = [...counts.keys()];
console.log(data);
console.log(label);
关于javascript - 将对象数组映射到两个数组的更好方法,一个是唯一键,另一个是出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46552128/