2 votes

Comment générer les clés des enfants à partir des clés des parents dans un tableau ?

Ninjas du JavaScript ! Maintenant j'ai cette collection :

var cats = [
    { id: 1, parent_id: 0, title: 'Movies' },
    { id: 2, parent_id: 0, title: 'Music' },
    { id: 3, parent_id: 1, title: 'Russian movies' },
    { id: 4, parent_id: 2, title: 'Russian music' },
    { id: 5, parent_id: 3, title: 'New' },
    { id: 6, parent_id: 3, title: 'Top10' },
    { id: 7, parent_id: 4, title: 'New' },
    { id: 8, parent_id: 4, title: 'Top10' },
    { id: 9, parent_id: 0, title: 'Soft' }
];

Et j'ai besoin de ce résultat :

var catsExtended = [
    { id: 1, parent_id: 0, childs: [ 3, 5, 6 ], title: 'Movies' },
    { id: 2, parent_id: 0, childs: [ 4, 7, 8 ], title: 'Music' },
    { id: 3, parent_id: 1, childs: [ 5, 6 ], title: 'Russian movies' },
    { id: 4, parent_id: 2, childs: [ 7, 8 ], title: 'Russian music' },
    { id: 5, parent_id: 3, childs: [], title: 'New' },
    { id: 6, parent_id: 3, childs: [], title: 'Top10' },
    { id: 7, parent_id: 4, childs: [], title: 'New' },
    { id: 8, parent_id: 4, childs: [], title: 'Top10' },
    { id: 9, parent_id: 0, childs: [], title: 'Soft' }
];

Aidez-moi s'il vous plaît à recueillir tous les IDs

2voto

Nina Scholz Points 17120

Vous pourriez utiliser une table de hachage pour la référence aux objets déjà retournés. Et pour les parents, il suffit d'itérer jusqu'à ce que parent_id devient nulle.

var cats = [{ id: 1, parent_id: 0, title: 'Movies' }, { id: 2, parent_id: 0, title: 'Music' }, { id: 3, parent_id: 1, title: 'Russian movies' }, { id: 4, parent_id: 2, title: 'Russian music' }, { id: 5, parent_id: 3, title: 'New' }, { id: 6, parent_id: 3, title: 'Top10' }, { id: 7, parent_id: 4, title: 'New' }, { id: 8, parent_id: 4, title: 'Top10' }, { id: 9, parent_id: 0, title: 'Soft' }],
    catsExtended = cats.map(function (a) {
        var id = a.parent_id;
        this[a.id] = { id: a.id, parent_id: a.parent_id, children: [], title: a.title };
        while (id) {
            this[id].children.push(a.id);
            id = this[id].parent_id;
        }
        return this[a.id];
    }, Object.create(null));

console.log(catsExtended);

1voto

haim770 Points 11507

Combinez map() y filter() :

var catsExtended = cats.map(function(cat) {
    return {
      id: cat.id,
      parent_id: cat.parent_id,
      title: cat.title,
      childs: cats.filter(function(c) {
        return c.parent_id == cat.id;
      }).map(function(c) {
        return c.id
      })
    };
});

0voto

Morteza Tourani Points 2673

Je pense qu'un simple Array.prototype.forEach peut faire beaucoup.

var cats = [{ id: 1, parent_id: 0, title: 'Movies' }, { id: 2, parent_id: 0, title: 'Music' }, { id: 3, parent_id: 1, title: 'Russian movies' }, { id: 4, parent_id: 2, title: 'Russian music' }, { id: 5, parent_id: 3, title: 'New' }, { id: 6, parent_id: 3, title: 'Top10' }, { id: 7, parent_id: 4, title: 'New' }, { id: 8, parent_id: 4, title: 'Top10' }, { id: 9, parent_id: 0, title: 'Soft' }];

cats.forEach(function(c) {
  var pid = c.parent_id;
  c.children = (this[c.id] = this[c.id] || []);
  (this[pid] = (this[pid] || [])).push(c.id)
}, Object.create(null));

console.clear();
console.log(cats);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X