我正在尝试确定最适合对由属性定义的组进行排序的对象数组的数据类型。 我有一个对象数组,如下所示:
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
}
];
我需要将这些对象分组到一个任意定义的组中。例如:
- 第一组:
性别
- 第二组:
年龄
然后给我展示的是(可视化):
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
循环来迭代键,并循环构建上面的对象,但我卡在了代码的那一部分。返回的对象将是:
{
"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
}
]
}
我考虑循环遍历对象中的每个键,在管道符(|
)处拆分,并使用递归构建一个新的对象,其中包含数据组/数组。
这是一种可怕的实现方式,但我不知道还有其他方法。
有没有更好的方法我可能没有想到?