Совместное использование карты и группы для преобразования массива - PullRequest
0 голосов
/ 02 ноября 2019

Мне нужна помощь для объединения карты и группы для преобразования моих данных:

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
    }
  ]
}

Так что для метки I 'я просто делаю

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

Но это не работает, так как я получаю все наборы данных за час, но мне нужны некоторые сгруппированные данные для оценки. А также с моей попыткой не сортировка вообще. Требуется сортировка по часам и счету.

1 Ответ

0 голосов
/ 02 ноября 2019

Сначала вам нужно будет перебрать элементы, чтобы создать карту наборов данных, индексированных 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...