Pregunta

I have a collection of names, each of which has one or more associated nicknames. I would like to transform this into a collection of nicknames, each of which with one or more names.

Here's an example. I would like to convert this:

[
    {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'}]},
]

Into this:

[
    {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'}]}
]

I would prefer to have a solution using underscore, but JavaScript would also be OK.

¿Fue útil?

Solución

I think I've got what you want.

Since Jack1 occurs twice in Jack, Jack has to appear twice in 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"}]}
]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top