Lo-Dash数组分组

时间:2014-07-08 08:25:12

标签: 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' }
];

我希望得到这个:

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

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

3 个答案:

答案 0 :(得分:6)

虽然回答了,但还是试一试。 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>';

答案 1 :(得分: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);

让我知道下划线/ lodash中是否有更强大的功能:-)!

Fiddle

答案 2 :(得分:0)

我得到了一些工作,但我还没有使用过Lo-Dash。所以也可以有更好的解决方案。

var regroupCharacters = function (characters) {
    var regrouped = [];
    for (var i = 0; i < characters.length; i++) {  //get one character
        var matched = false;
        for (var j = 0; j < regrouped.length; j++) { 
            if(characters[i].name == regrouped[j].name){  // check in each regrouped element if character is there just add the pet 
                matched = true;
                regrouped[j].pets.push(characters[i].pet);
            }
        };
        if(!matched){  // if it is a new character
            var newCharacter = {'name':characters[i].name,'age':characters[i].age,pets:[characters[i].pet]};
            regrouped.push(newCharacter);       
        }
    };
    return regrouped;
}

调用该函数: -

var regrouped = regroupCharacters(characters);

我使用pets作为字段而不是pet,因为它是一个集合,如果您有任何问题,可以更改它。