Я пытаюсь сгруппировать массив объектов.
Функция, предоставляемая этой сущностью, почти работает как задумано и использует lodash в качестве основы:
https://gist.github.com/joyrexus/9837596
const _ = require('lodash');
function nest(seq, keys) {
if (!keys.length) return seq;
let [first, ...rest] = keys;
return _.mapValues(_.groupBy(seq, first), value => nest(value, rest));
}
Это рекурсивно,
Однако есть две проблемы, с которыми я сталкиваюсь.
- если для параметра установлено значение
null
или undefined
, он используется как группа, вместо
- необязательный атрибут объекта должен использоваться в качестве конечного ключа объекта, поэтому есть только объекты, но не массивы. Этот атрибут всегда должен быть уникальным для правильной работы.
Возможно ли объединить или расширить существующую функцию nest
для решения вышеуказанных пунктов?
Плюсы этого метода в том, что вместо ключей я также могу использовать массив функций (p => p.parameterGroup1
) для возврата параметра. Поэтому вместо последнего необязательного параметра я мог бы также использовать p => p.parameterGroup1 ? p.parameterGroup1 : p.label
Я подготовил небольшой тест, чтобы дать вам лучшее представление о том, что ожидается:
test('nest array of objects by groups as keys, stopping at null and using a final label param', t => {
let properties = [
{
parameterGroup1: 'first',
parameterGroup2: 'second',
parameterGroup3: 'third',
label: 'A'
},
{
parameterGroup1: 'first',
parameterGroup2: 'second',
parameterGroup3: null,
label: 'B'
},
{
parameterGroup1: 'a',
parameterGroup2: 'b',
parameterGroup3: undefined,
label: 'C'
},
]
let expected = {
first: {
second: {
third: {
A: {
parameterGroup1: 'first',
parameterGroup2: 'second',
parameterGroup3: 'third',
label: 'A'
}
},
B: {
parameterGroup1: 'first',
parameterGroup2: 'second',
parameterGroup3: null,
label: 'B'
}
}
},
a: {
b: {
C: {
parameterGroup1: 'a',
parameterGroup2: 'b',
parameterGroup3: undefined,
label: 'C'
}
}
}
}
let grouped = nest(properties, ['parameterGroup1', 'parameterGroup2', 'parameterGroup3'], 'label')
t.deepEqual(grouped, expected)
})
Заранее спасибо!