У меня есть следующая структура данных:
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?
Вы можете использовать объект сопоставления с каждым 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)
Я пометил его как принятый, но с ним есть две проблемы: forEach(({ MainHeader, SubHeader }) выдает ошибку, а Object.values не работает в IE. Мне удалось устранить вторую проблему, но forEach(({ MainHeader, SubHeader }) Мне нужно переработать... есть идеи как? Я не знаком с этим синтаксисом и не могу найти его в документации forEach
@sarsnake, вероятно, из-за деструктурирование параметра (новый синтаксис ES6). Вы можете использовать его без него, например: jsfiddle.net/adigas/u0js2pbh (Object.values
также ES6 BTW)
Спасибо, но он все еще не работает в этом IE11... который, к сожалению, мне приходится поддерживать.
@sarsnake обновил ответ альтернативным синтаксисом ES5 (для IE11). Надеюсь, я рассмотрел все (от let
до var
, стрелочные функции до function
, удалил деструктурирование, изменил использование Object.keys
для получения значений и т. д.)
Да спасибо большое!!!!!
Спасибо, он работает здесь, но я получаю синтаксическую ошибку "Ожидается:"... сейчас изучаю его и приму, как только смогу заставить его работать. Большое спасибо за фактический ответ на мой очень конкретный вопрос.