下划线_.object但具有重复的处理函数,可能吗?

时间:2014-07-07 21:07:42

标签: javascript underscore.js

我不想删除重复项,我希望能够使用函数处理副本。

关于如何在_.chain中做到这一点的任何想法?

_.chain(users)
    .map(function(user)
    {
        return [user.username, user]
    })
    .object() //but handle the duplicate collisions instead of losing them
    .value();

具体来说,我想在发生用户名冲突时更改用户名,理想情况是:

 .object(values, function duplicateHandler(value)
{
     value.username = value.username + '_' + 1;
});

如果它还可以重新应用以重新检查其独特性,那就太棒了。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作,将具有相同用户名的所有记录组合在一个数组中:

_.chain(users)
    .groupBy('username')
    .value();

或者这是以你喜欢的方式处理它们

_.chain(users)
    .groupBy('username')
    .map(function(userArray, username) { ... })
    .object()
    .value();

例如:

var users = [ 
    { username: 'one' }, 
    { username: 'two' }, 
    { username: 'two' } 
];

var obj = 
    _.chain(users)
        .groupBy('username')
        .map(function(userArray, username) { 
            return (userArray.length === 1)
                ? [[username, userArray[0]]]
                : _.map(userArray, function(v, i) {
                    return [username + '_' + (i+1), v]
                });
        })
        .flatten(true)
        .object()
        .value();

console.log(obj);

将产生:

{one: Object, two_1: Object, two_2: Object}

Object 表示users中声明的原始对象的引用。

Demonstration