我有一个对象数组,我正在努力想出一个更好的方法将它映射到两个新数组:一个包含一个唯一代码值列表,另一个包含一个出现的计数每个代码。
注意:结果数组的顺序很重要。例如,data [1]应该是标签出现的次数[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']

答案 0 :(得分:1)
使用更新版本的Javascript更干净一点,但应该是相同的。看看吧。
const objs = [{
code: 200,
message: 'a'
},
{
code: 300,
message: 'b'
},
{
code: 200,
message: 'c'
},
{
code: 400,
message: 'd'
},
{
code: 200,
message: 'e'
},
];
const data = [];
const labels = [];
objs.forEach(obj => {
if (labels.indexOf(obj.code) < 0) {
labels.push(obj.code);
data.push(1);
} else {
const index = labels.indexOf(obj.code);
data[index] ++;
}
});
console.log('data', data);
console.log('labels', labels);
答案 1 :(得分:1)
您可以为索引更新数组使用哈希表。
var values = [{ code: 200, message: 'a' }, { code: 300, message: 'b' }, { code: 200, message: 'c' }, { code: 400, message: 'd' }, { code: 200, message: 'e' }],
hash = Object.create(null),
data = [],
label = [];
values.forEach(function (o) {
if (o.code in hash) {
data[hash[o.code]] += 1;
return;
}
hash[o.code] = data.push(1) - 1;
label.push(o.code);
});
console.log(data);
console.log(label);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:1)
这看起来像你想要一个像数组一样的对象并且可以具有键值。 我建议使用地图
看看这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
通过这个你可以用一个循环来实现这个并获得你需要的正确结果
答案 3 :(得分:1)
You can use reduce将对象数组转换为Map,然后提取{{ 3}}和values到数组:
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);
&#13;