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}});
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é.
Lodash vous permet de filtrer les données imbriquées (y compris les tableaux) comme ceci:
_.filter(modules, { submodules: [ { id: 2 } ]});
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}});