web-dev-qa-db-fra.com

Rechercher un objet par correspondance dans un tableau imbriqué

Je ne vois pas un moyen de find objets lorsque ma condition impliquerait un tableau imbriqué.

var modules = [{
    name: 'Module1',
    submodules: [{
        name: 'Submodule1',
        id: 1
      }, {
        name: 'Submodule2',
        id: 2
      }
    ]
  }, {
    name: 'Module2',
    submodules: [{
        name: 'Submodule1',
        id: 3
      }, {
        name: 'Submodule2',
        id: 4
      }
    ]
  }
];

Cela ne fonctionnera pas car submodules est un tableau, pas un objet. Y a-t-il un raccourci qui ferait fonctionner cela? J'essaie d'éviter d'itérer le tableau manuellement.

_.where(modules, {submodules:{id:3}});
22
helion3

Voici ce que j'ai trouvé:

_.find(modules, _.flow(
    _.property('submodules'),
    _.partialRight(_.some, { id: 2 })
));
// → { name: 'Module1', ... }

En utilisant flow () , vous pouvez construire une fonction de rappel qui fait ce dont vous avez besoin. Lors de l'appel, les données circulent à travers chaque fonction. La première chose que vous voulez est la propriété submodules, et vous pouvez l'obtenir en utilisant la fonction property () .

Le tableau des sous-modules est ensuite introduit dans some () , qui retourne vrai s'il contient le sous-module que vous recherchez, dans ce cas, l'ID 2.

Remplacez find() par filter() si vous recherchez plusieurs modules, et pas seulement le premier trouvé.

15
Adam Boduch

Lodash vous permet de filtrer les données imbriquées (y compris les tableaux) comme ceci:

_.filter(modules, { submodules: [ { id: 2 } ]});

57
martinoss

Je pense que votre meilleure chance est d'utiliser une fonction pour obtenir le module.

_.select(modules, function (module) {
  return _.any(module.submodules, function (submodule) {
    return _.where(submodule, {id:3});
  });
});

essayez ceci pour obtenir le sous-module

. where (. pluck (modules, "submodules"), {submodules: {id: 3}});

0
Mabedan