映射和组的组合使用以变换数组

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

我需要一些帮助来组合地图和组以转换数据:

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: // ??
  })
})

但是这不起作用,因为我确实获得了一个小时的所有数据集,但是我需要一些分数的分组数据。而且,根据我的尝试,根本没有排序。需要对小时和分数进行排序。

javascript arrays object grouping
1个回答
0
投票

您首先必须遍历所有项目,以创建一个以score索引的数据集地图,其值是迄今为止为该分数找到的当前value的数组。在每次迭代中,如果不存在相关分数,则首先创建该数组,然后将其推送到该数组。迭代后,获取该映射的条目并将其映射到具有datascore属性的新数组:

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);
© www.soinside.com 2019 - 2024. All rights reserved.