Группировка объектов массива на основе значений

1

Поэтому у меня есть переменная объекта массива с этой структурой

var array_obj = [
   {
      Gooble: 240,
      year: 2018
   },
   {
      Koolle: 220,
      year: 2018
   }
    {
      Zooae: 220,
      year: 2015
   }
];

Но я хочу следовать этой структуре, а https://www.amcharts.com/demos/stacked-column-chart

Так что теперь это должно быть

    var array_obj = [
       {
          Gooble: 240,
          Koolle: 220,
          year: 2018
       },
       {
          Zooae: 220,
          year: 2015
       }
    ];

Я пытался с этим циклом, но я не могу сделать это правильно.

for(var i in array_obj){
   if(array_obj[i].year == array_obj[i].year){
      # Push here
   }
}
  • 0
    Предложенная структура, вероятно, должна быть больше похожа на [{ year: 2018, entries: [{ name: 'Zooae', value: 220 }, ...] }, ...] или аналогичные?
  • 0
    @Marty Я следую этой структуре из этого графика amcharts.com/demos/stacked-column-chart
Теги:
arrays

2 ответа

1
Лучший ответ

Другим решением является создание объекта с годом в виде ключей и комбинированных данных в качестве значений:

var array_obj = [{
    Gooble: 240,
    year: 2018
  },
  {
    Koolle: 220,
    year: 2018
  },
  {
    Zooae: 220,
    year: 2015
  }
];

let yearBuckets = {};
array_obj.forEach(b => {
  if (b.year in yearBuckets) Object.assign(yearBuckets[b.year], b);
  else yearBuckets[b.year] = b;
});
console.log(Object.values(yearBuckets));
1

Используйте reduce для создания объекта объектов, индексированных по году, сначала создавая подобъект, если он не существует, а затем перебирает свойства, отличные от года, и назначая соответствующий ключ в подобъекте.

Также обязательно исправьте свой вход array_obj - все элементы массива должны быть разделены запятыми, чтобы синтаксис был действительным:

var array_obj = [
   {
      Gooble: 240,
      year: 2018
   },
   {
      Koolle: 220,
      year: 2018
   },
    {
      Zooae: 220,
      year: 2015
   }
];
const outputByYear = array_obj.reduce((a, { year, ...rest }) => {
  if (!a[year]) a[year] = { year };
  Object.entries(rest).forEach(([key, val]) => {
    a[year][key] = val;
  });
  return a;
}, {});
console.log(Object.values(outputByYear));
  • 0
    Я попробую это. Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню