有没有方法将对象数组拆分成组?

时间:2015-04-28 00:13:46

标签: javascript arrays

假设我有一组具有某种可分组键的对象:

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
]

我自己可以编写这个算法,但我真的只是想知道是否有一个本机数组方法 - 或者可能存在于另一种可能被填充的语言中的方法?

3 个答案:

答案 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: []});
相关问题