Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 低破折号数组分组_Javascript_Arrays_Lodash - Fatal编程技术网

Javascript 低破折号数组分组

Javascript 低破折号数组分组,javascript,arrays,lodash,Javascript,Arrays,Lodash,我现在在Lo Dash文档网站上花了几个小时,找不到解决问题的方法。我不知道它叫什么,所以搜索起来有点困难。我基本上想把一个数组分组到一个对象中,这样重复的条目就是一个字段,而不同的条目就是一个数组 例如,我有一个数组: var characters = [ { 'name': 'barney', 'age': 42, 'pet': 'dog' }, { 'name': 'fred', 'age': 35, 'pet': 'dog' }, { 'name': 'barney'

我现在在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' ] }
]

是否有一个低破折号的方法来做这件事,或我必须链几个?实现这一目标的最佳方法是什么?

我有些东西可以用,但我还没有用过它。因此,也可能有更好的解决方案

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;
}

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

这里是一个更简单的方式,用下划线表示:

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:-)中是否有更令人敬畏的功能


这里有一个更优雅、更短的解决方案,其中包括链接:

var字符=[{
'姓名':'巴尼',
年龄:42岁,,
“宠物”:“狗”
}, {
'姓名':'弗雷德',
年龄:35岁,,
“宠物”:“狗”
}, {
'姓名':'巴尼',
年龄:42岁,,
“宠物”:“猫”
}, {
'姓名':'弗雷德',
年龄:35岁,,
“宠物”:“鱼”
}];
var result=U8;(字符).groupBy('name').transform(函数(结果,当前){
结果:推({
名称:当前[0]。名称,
年龄:当前[0]。年龄,
宠物:地图(当前“宠物”)
});
},[])。value();
document.write(“”+JSON.stringify(result,null,'\t')+“”)

虽然得到了回答,但仍然是一次尝试

var字符=[
{'name':'barney','age':42,'pet':'dog'},
{'name':'fred','age':35,'pet':'dog'},
{'name':'barney','age':42,'pet':'cat'},
{‘姓名’:‘弗雷德’,‘年龄’:35,‘宠物’:‘金鱼’}
];
var result=u.chain(characters).groupBy(“name”).map(函数(v,i){
返回{
姓名:我,,
年龄:u.get(u.find(v,'age'),'age'),
宠物:u.map(v,'pet')
}
}).value();
document.body.innerHTML=''+JSON.stringify(结果,null'')+'';

您尝试了什么失败的方法?只需一个普通数组
。reduce()
就可以了。您不知道角色对象中的键是什么,它们的值可能是什么吗?@zerkms我不知道如何。。。你能给我看看吗?@Mritunjay我知道我的密钥是什么,但不知道可能的值。这对我有什么帮助?它只适用于上面的示例数据。如果数据如下:{'name':'barney','age':42,'pet':'dog'},{'name':'fred','age':35,'pet':'dog'},{'name':'barney','age':40,'pet':'dog'},{'name':'fred','age''35,'pet pet goldfish'}@GaganPrajapati有什么意义?数据是一个对象数组。为什么要从数据中提取数组符号。你想在没有数组的情况下使用吗?抱歉,没有说清楚。实际上,它仍然是一个数组。我刚刚把其中一只宠物的年龄改为40岁。所以,它应该给我3个对象,而不是2个。但是,我仍然得到2个对象,40岁的对象仍然是42岁的对象。我得到了解决方案,但今天读了评论。@GaganPrajapati你能在codepen/jsdiffle中分享你的代码片段吗?我仍然不清楚这个错误。我改变了宠物的年龄。所以,应该有4个不同的组,但我只得到2个。这不是针对特定年龄的分组
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);
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>';