Lo-Dash数组分组

Ter*_*rry 10 javascript arrays lodash

我现在花了几个小时在Lo-Dash文档站点上,找不到我的问题的解决方案.我不知道它是如何调用的,因此搜索起来有点困难.我基本上想要将数组分组到一个对象中,以便重复的条目是一个字段,而不同的条目是一个数组.

例如,我有这个数组:

var characters = [
  { 'name': 'barney', 'age': 42,  'pet': 'dog' },
  { 'name': 'fred',   'age': 35,  'pet': 'dog' },
  { 'name': 'barney', 'age': 42,  'pet': 'cat' },
  { 'name': 'fred',   'age': 35,  'pet': 'goldfish' }
];
Run Code Online (Sandbox Code Playgroud)

我希望得到这个:

[
  { name: 'barney',
    age: 42,
    pet: [ 'dog', 'cat' ] },
  { name: 'fred',
    age: 35,
    pet: [ 'dog', 'goldfish' ] }
]
Run Code Online (Sandbox Code Playgroud)

有没有一个Lo-Dash方法来做这个,还是我必须链接几个?实现这一目标的最佳方法是什么?

Mah*_*bub 7

虽然回答了,还是一试.的jsfiddle

var characters = [
      { 'name': 'barney', 'age': 42,  'pet': 'dog' },
      { 'name': 'fred',   'age': 35,  'pet': 'dog' },
      { 'name': 'barney', 'age': 42,  'pet': 'cat' },
      { 'name': 'fred',   'age': 35,  'pet': 'goldfish' }
    ];

var result=_.chain(characters).groupBy("name").map(function(v, i) {
      return {
        name: i,
        age: _.get(_.find(v, 'age'), 'age'),
        pet: _.map(v, 'pet')
      }
    }).value();

document.body.innerHTML = '<pre>' + JSON.stringify(result, null, '  ') + '</pre>';
Run Code Online (Sandbox Code Playgroud)


Die*_*erg 4

这是一种更简单的下划线方式:

var result = _.reduce(characters, function (prev, current) {
    var char = _.find(prev, function (character) {
        return character['name'] === current['name'];
    });

    // Character does not yet exists in the array, push it
    if (char === undefined) {
        prev.push(current);
    } else {
        // If char['pet'] is not an array, create one
        if (!_.isArray(char['pet'])) {
            char['pet'] = [char['pet']];
        }

        // Push the current pets to the founded character
        char['pet'].push(current['pet']);
    }

    return prev;
}, []); // Initialize an empty array for the prev object

console.log(result);
Run Code Online (Sandbox Code Playgroud)

让我知道 underscore/lodash 是否有更棒的功能:-)!

小提琴