Я пытаюсь определить лучший тип данных для сортировки массива объектов в группы, определенные свойствами. У меня есть массив объектов, например:Группировка по нескольким полям на объект
var people = [
{
name: 'Pete',
gender: 'Male',
age: 22
},
{
name: 'Samantha',
gender: 'Female',
age: 20
},
{
name: 'Frank',
gender: 'Male',
age: 22
},
{
name: 'Gary',
gender: 'Male',
age: 21
},
{
name: 'Maria',
gender: 'Female',
age: 20
},
{
name: 'Hannah',
gender: 'Female',
age: 21
},
{
name: 'Pete',
gender: 'Male',
age: 20
}
];
Мне нужно сгруппировать эти объекты в произвольно определенную группу. Например:
- Группа 1:
gender
- Группа 2:
age
(Это может быть определено сервером и может измениться, чтобы содержать третью группу, если мы хотим.)
Что затем дает мне (визуально):
Male:
21:
Gary
22:
Pete
Frank
Female
20:
Samantha
Maria
21:
Hannah
I думаю, что соответствующий тип данных будет объектом объектов. Тая .:
{
Male: {
21: {
[
{
name: 'Gary',
gender: 'Male',
age: 21
}
]
},
22: {
[
{
name: 'Pete',
gender: 'Male',
age: 22
},
{
name: 'Frank',
gender: 'Male',
age: 22
}
]
}
},
Female: {
20: {
[
{
name: 'Samantha',
gender: 'Female',
age: 20
},
{
name: 'Maria',
gender: 'Female',
age: 20
}
]
},
21: {
[
{
name: 'Hannah',
gender: 'Female',
age: 21
}
]
}
}
}
Но я не могу работать, для жизни меня, соответствующий алгоритм для сортировки этих объектов в данном тип, который представляет выше.
Там полезная утилита в underscore.js
называется _.groupBy(arr, callback)
, которые можно использовать следующим образом:
_.groupBy(people, function (person) {
var props = ['gender', 'age'], // server-defined
prop = [];
for (var i = 0, length = props.length; i < length; i++) {
prop.push(person[props[i]]);
}
return prop.join('|');
});
Это дает мне объект 1-глубины, которые я могу использовать for...in
цикл для перебора ключей, и петля чтобы построить объект выше, но это тот бит кода, на который я застрял.
Возвращаемый объект будет:
{
"Male|22": [
{
"name": "Pete",
"gender": "Male",
"age": 22
},
{
"name": "Frank",
"gender": "Male",
"age": 22
}
],
"Female|20": [
{
"name": "Samantha",
"gender": "Female",
"age": 20
},
{
"name": "Maria",
"gender": "Female",
"age": 20
}
],
"Male|21": [
{
"name": "Gary",
"gender": "Male",
"age": 21
}
],
"Female|21": [
{
"name": "Hannah",
"gender": "Female",
"age": 21
}
],
"Male|20": [
{
"name": "Pete",
"gender": "Male",
"age": 20
}
]
}
Я имею в виду то пробегаем по каждому ключу в объекте, расщепление на трубе (|
) и с помощью рекурсии построить новый объект объектов, содержащих групп/массива данных.
Это такой ужасный способ достижения этого, но я не знаю, как это сделать в противном случае.
Есть ли лучший способ, которым я не хватает?
Это работает! И группировка допускает произвольную длину. :) Можете ли вы описать это немного подробнее? – keldar
У меня было что-то подобное - но это было ужасно многословно и хотелось чего-то гораздо более кратким :) - это потрясающе! – keldar