假设我有一组具有某种可分组键的对象:
var people = [
{ 'name':'Alice', 'gender': 'female' },
{ 'name':'Bob', 'gender': 'male' },
{ 'name':'Jeremy', 'gender': 'male' },
{ 'name':'Jess', 'gender': 'female' },
{ 'name':'Seymour', 'gender': 'female' },
];
是否有一个(原生)函数/方法可以应用于数组以解压缩'将数组分成两个数组,如:
boysAndGirls = people.[**something**]('gender');
这可能导致:
{
'male': [ ... ],
'female': [ ... ]
}
甚至:
[
[ {Bob, ...}, {Jeremy, ...}, {Seymour, ...} ], // 'males' array
[ {Alice, ...}, {Jess, ...} ] // 'female' array
]
我自己可以编写这个算法,但我真的只是想知道是否有一个本机数组方法 - 或者可能存在于另一种可能被填充的语言中的方法?
答案 0 :(得分:0)
JavaScript中没有这样的方法。 Ruby在Enumerator#group_by
中有它:
people.group_by { |person| person['gender'] }
并且用JavaScript编写也很容易。事实上,一些图书馆已经拥有它,例如Lodash
_.groupBy(people, function(person) {
return person['gender'];
});
如果您自己编写,可以稍微自定义:
function groupByProp(array, prop) {
var result = {};
array.forEach(function(item) {
var val = item[prop];
if (!result[val]) result[val] = [item];
else result[val].push(item);
});
return result;
}
groupByProp(people, 'gender');
答案 1 :(得分:-1)
没有本机Javascript功能,但您可以使用以下代码:
NAME
答案 2 :(得分:-2)
对于原生解决方案,我能想到的最接近的事情就是使用reduce
。它并不像你想要的那么简单,但它有效:
var boysAndGirls = people.reduce(function(obj, item) {
obj[item.gender].push(item.name);
return obj;
}, {male: [], female: []});