Манипулировать объектом с помощью JS

У меня есть этот объект:

const data = {
    Jan: [{product: 'Shirt', num: '13'}, {product: 'Shoes', num: '15'}],
    Feb: [{product: 'Shirt', num: '22'}, {product: 'Shoes', num: '1'}],
    Mar: [{product: 'Shirt', num: '15'}, {product: 'Shoes', num: '25'}]
}

Мне нужно создать еще один объект, который выглядит так:

const data = {
    labels: ['Jan', 'Feb', 'Mar'],
    datasets: [
    {
        label: 'Shirt',
        data: [13, 22, 15]
    },
    {
        label: 'Shoes',
        data: [15, 1, 25]
    }
    ]
  }

Объект выше предназначен для диаграммы. Массив данных в массиве наборов данных соответствует каждому значению продукта за месяц.

заранее спасибо

Откуда берутся цвета? Где ваши усилия до сих пор?

evolutionxbox 10.05.2022 13:32

Цвета не имеют значения. я удалю их

Kris 10.05.2022 13:33

labels есть Object.keys(data). Наборы данных сгруппированы. Вы можете найти десятки дубликатов.

jabaa 10.05.2022 13:34

Что вы пробовали и что не сработало, как ожидалось? Я полагаю, вы могли бы получить свой labels от ключей в объекте, который у вас есть. И вы можете перебрать имеющиеся у вас данные (возможно, более одного раза), чтобы построить свои datasets и data внутри них.

David 10.05.2022 13:35

Да, с метками Object.keys() все в порядке. Я пробовал зацикливаться с for in, но не понимаю, как создавать наборы данных.

Kris 10.05.2022 13:36

Для наборов данных вы можете использовать Объекты группы Javascript по свойству с Object.values(data).flat()

jabaa 10.05.2022 13:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать набор данных с помощью Array.prototype.reduce и создать новый массив данных.

Обратите внимание, что вам нужно сгладить массив, так как Object.values(data) дает вам массив массивов.

const data = {
    Jan: [{product: 'Shirt', num: '13'}, {product: 'Shoes', num: '15'}],
    Feb: [{product: 'Shirt', num: '22'}, {product: 'Shoes', num: '1'}],
    Mar: [{product: 'Shirt', num: '15'}, {product: 'Shoes', num: '25'}]
};

// Iterate through the data object's value and flatten this
// For example the Object.values(data) will provide you-
// [[{product: 'shirt', num: '13'}, {product: 'Shoes', num: '15'}], [{product: 'Shirt', num: '22'}, {product: 'Shoes', num: '1'}]] so on and so forth
// Need to make this a linear array using flat(1)

const dataset = Object.values(data).flat(1).reduce((acc, curr) => {

  // Check if the product exists on the accumulator or not. If not then create a new
  // object for the product.
  // For example, this will create - {'Shirt': {label: 'Shirt', data: [13]}}
  if (acc[curr.product] === undefined) {
    acc[curr.product]  = {
      label: curr.product,
      data: [Number(curr.num)]
    }
  } else {
    // If the product already exists then push the num to the data array
    acc[curr.product].data.push(Number(curr.num))
  }
  
  return acc;
}, {});



const newData = {
  labels: Object.keys(data), // Set the keys as the labels
  dataset: Object.values(dataset) // dataset is an object, just extract the values as an array
}

console.info(newData);
.as-console-wrapper{ min-height: 100vh!important; top: 0;}

Спасибо @Sajeeb. Я потрачу столько времени, сколько мне нужно, чтобы понять это и извлечь из этого уроки.

Kris 10.05.2022 14:02

Я просто написал несколько комментариев, чтобы вы могли легко понять.

Sajeeb Ahamed 10.05.2022 14:09

Другие вопросы по теме