使用underscore.js / js反转父子关系

时间:2014-04-23 09:32:21

标签: javascript underscore.js grouping

我有一组名字,每个名字都有一个或多个相关的昵称。我想将其转换为昵称集合,每个昵称都有一个或多个名称。

这是一个例子。我想转换一下:

[
    {id:1, name:'Jack', children:[{nickname:'Jack1'},{nickname:'Jack1'}]},
    {id:2, name:'Sam',  children:[{nickname:'Sam1'}, {nickname:'Sam2'}]},
    {id:3, name:'Tom',  children:[{nickname:'Tom1'}, {nickname:'Tom2'}]},
]

进入这个:

[
    {nickname:'Jack1', obj:[{id:1,name:"Jack"},{id:1,name:'Jack'}]},
    {nickname:'Sam1',  obj:[{id:2,name:'Sam'}]},
    {nickname:'Sam2',  obj:[{id:2,name:'Sam'}]},
    {nickname:'Tom1',  obj:[{id:3,name:'Tom'}]},
    {nickname:'Tom2',  obj:[{id:3,name:'Tom'}]}
]

我更喜欢使用下划线的解决方案,但JavaScript也可以。

1 个答案:

答案 0 :(得分:2)

我想我已经得到了你想要的东西。

由于Jack1Jack中出现两次,Jack必须在Jack1中出现两次:

var a = [
    {id:1, name:'Jack', children:[{nickname:'Jack1'},{nickname:'Jack1'}]},
    {id:2, name:'Sam',  children:[{nickname:'Sam1'}, {nickname:'Sam2'}]},
    {id:3, name:'Tom',  children:[{nickname:'Tom1'}, {nickname:'Tom2'}]},
]

var b = [];

for(var i = 0; i < a.length; i++){
    for(var j = 0; j < a[i].children.length; j++){
        if(b.filter(function(e){
            return e.hasOwnProperty('nickname') && e.nickname == a[i].children[j].nickname;
        }).length === 0){
            b.push({
                nickname: a[i].children[j].nickname,
                obj:[{id:a[i].id, name: a[i].name}]});
        }else{
            for(var k = 0; k < b.length; k++){
                if(b[i].nickname == a[i].children[j].nickname){
                    b[i].obj.push({id:a[i].id, name: a[i].name})
                }
            }
        }
    }
}

console.log(b);

// Result:
[
    {"nickname": "Jack1", "obj": [{"id": 1, "name": "Jack"},
                                  {"id": 1, "name": "Jack"}]},
    {"nickname": "Sam1",  "obj": [{"id": 2, "name": "Sam"}]},
    {"nickname": "Sam2",  "obj": [{"id": 2, "name": "Sam"}]},
    {"nickname": "Tom1",  "obj": [{"id": 3, "name": "Tom"}]},
    {"nickname": "Tom2",  "obj": [{"id": 3, "name": "Tom"}]}
]