Сгруппировать массив по имени свойства и добавить количество

У меня есть следующая структура данных:

var data = [
   { MainHeader: Header1, SubHeader: 'one'},
   { MainHeader: Header1, SubHeader: 'two'},
   { MainHeader: Header2, SubHeader: 'three'},
   { MainHeader: Header2, SubHeader: 'four'},
   { MainHeader: Header2, SubHeader: 'five'}
];

Мне нужно превратить это во что-то вроде этого:

var groupheaders = [
  { startColName: 'one', numberofCols: 2, title: Header1},
  { startColName: 'three', numberofCols: 3, title: Header2}
];

Есть ли элегантный способ добиться этого с помощью Lodash?

Поведение ключевого слова "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) для оценки ваших знаний,...
4
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете использовать объект сопоставления с каждым MainHeader в качестве ключа. Обновите счетчик ключа, если MainHeader уже добавлен. В противном случае добавьте новый ключ и объект в качестве его значения.

Затем используйте Object.values(), чтобы получить значения в виде массива:

const data = [{MainHeader:"Header1",SubHeader:"one"},{MainHeader:"Header1",SubHeader:"two"},{MainHeader:"Header2",SubHeader:"three"},{MainHeader:"Header2",SubHeader:"four"},{MainHeader:"Header2",SubHeader:"five"}],
      map = {};

data.forEach(({ MainHeader, SubHeader }) => {
  if (map[MainHeader])
    map[MainHeader].numberofCols++
  else
    map[MainHeader] = { title: MainHeader, startColName: SubHeader, numberofCols: 1 };
})

let output = Object.values(map);

console.info(output)

Решение ES5:

var data = [{MainHeader:"Header1",SubHeader:"one"},{MainHeader:"Header1",SubHeader:"two"},{MainHeader:"Header2",SubHeader:"three"},{MainHeader:"Header2",SubHeader:"four"},{MainHeader:"Header2",SubHeader:"five"}],
      map = {};

data.forEach(function(o) {
  if (map[o.MainHeader])
    map[o.MainHeader].numberofCols++
  else
    map[o.MainHeader] = { title: o.MainHeader, startColName: o.SubHeader, numberofCols: 1 };
})

var output = Object.keys(map).map(function(k) {
  return map[k];
});

console.info(output)

Спасибо, он работает здесь, но я получаю синтаксическую ошибку "Ожидается:"... сейчас изучаю его и приму, как только смогу заставить его работать. Большое спасибо за фактический ответ на мой очень конкретный вопрос.

sarsnake 09.04.2019 22:29

Я пометил его как принятый, но с ним есть две проблемы: forEach(({ MainHeader, SubHeader }) выдает ошибку, а Object.values ​​не работает в IE. Мне удалось устранить вторую проблему, но forEach(({ MainHeader, SubHeader }) Мне нужно переработать... есть идеи как? Я не знаком с этим синтаксисом и не могу найти его в документации forEach

sarsnake 09.04.2019 23:03

@sarsnake, вероятно, из-за деструктурирование параметра (новый синтаксис ES6). Вы можете использовать его без него, например: jsfiddle.net/adigas/u0js2pbh (Object.values также ES6 BTW)

adiga 09.04.2019 23:03

Спасибо, но он все еще не работает в этом IE11... который, к сожалению, мне приходится поддерживать.

sarsnake 09.04.2019 23:07

@sarsnake обновил ответ альтернативным синтаксисом ES5 (для IE11). Надеюсь, я рассмотрел все (от let до var, стрелочные функции до function, удалил деструктурирование, изменил использование Object.keys для получения значений и т. д.)

adiga 09.04.2019 23:10

Да спасибо большое!!!!!

sarsnake 09.04.2019 23:13

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