我需要一些帮助来组合地图和组以转换数据:
const source = [
{ _id: { hour: 18, score: 1 }, value: 45 },
{ _id: { hour: 18, score: 5 }, value: 23 },
{ _id: { hour: 18, score: 4 }, value: 34 },
{ _id: { hour: 20, score: 1 }, value: 47 },
{ _id: { hour: 20, score: 5 }, value: 25 },
{ _id: { hour: 20, score: 4 }, value: 36 },
{ _id: { hour: 19, score: 1 }, value: 46 },
{ _id: { hour: 19, score: 5 }, value: 24 },
{ _id: { hour: 19, score: 4 }, value: 35 }
]
这是结果的样子:
{
label: [18, 19, 20], // reordered hour values
datasets: [
{ // each sorted score should get the values in an array sorted by hour
data: [45, 46, 47],
score: 1
},
{
data: [34, 35, 36],
score: 4
},
{
data: [23, 24, 25],
score: 5
}
]
}
所以我只是在做标签
const label = data.map(d => d._id.hour)
如何获得每个分数的数据集data
?我会想到一个循环:
label.forEach(function(element) {
datasets.push({
data: source.filter(d => d._id.hour === element).map(d => d.value),
score: // ??
})
})
但是这不起作用,因为我确实获得了一个小时的所有数据集,但是我需要一些分数的分组数据。而且,根据我的尝试,根本没有排序。需要对小时和分数进行排序。
您首先必须遍历所有项目,以创建一个以score
索引的数据集地图,其值是迄今为止为该分数找到的当前value
的数组。在每次迭代中,如果不存在相关分数,则首先创建该数组,然后将其推送到该数组。迭代后,获取该映射的条目并将其映射到具有data
和score
属性的新数组:
const source = [
{ _id: { hour: 18, score: 1 }, value: 45 },
{ _id: { hour: 18, score: 5 }, value: 23 },
{ _id: { hour: 18, score: 4 }, value: 34 },
{ _id: { hour: 20, score: 1 }, value: 47 },
{ _id: { hour: 20, score: 5 }, value: 25 },
{ _id: { hour: 20, score: 4 }, value: 36 },
{ _id: { hour: 19, score: 1 }, value: 46 },
{ _id: { hour: 19, score: 5 }, value: 24 },
{ _id: { hour: 19, score: 4 }, value: 35 }
];
const getHour = item => item._id.hour;
source.sort((a, b) => getHour(a) - getHour(b));
const label = [...new Set(source.map(getHour))];
const datasetsObj = {};
for (const { value, _id: { score } } of source) {
if (!datasetsObj[score]) {
datasetsObj[score] = [];
}
datasetsObj[score].push(value);
}
const datasets = Object.entries(datasetsObj)
.map(([score, data]) => ({ data, score }));
const output = { label, datasets };
console.log(output);