我正在尝试确定最佳数据类型以将对象数组排序为属性定义的组。我有一个对象阵列,如下所示:按对象分组的多个字段
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
我认为适当的数据类型将是对象的对象。即:
{
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('|');
});
这给了我,我可以用一个for...in
循环遍历键1 - 深度对象和循环通过构建上面的对象,但这是我坚持的代码。
返回的对象是:
{
"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