Jquery comment trouver un Objet par un attribut dans un Tableau
Donné que j'ai un tableau de "but" des objets:
//array of purpose objects:
var purposeObjects = [
{purpose: "daily"},
{purpose: "weekly"},
{purpose: "monthly"}
];
(pour des raisons de simplicité, je suis en omettant d'autres attributs)
Maintenant, je veux avoir une méthode qui retourne un des objets si une correspondance but nom est trouvé.
Ce n'est pas de travail:
function findPurpose(purposeName){
return $.grep(purposeObjects, function(){
return this.purpose == purposeName;
});
};
findPurpose("daily");
mais en fait elle renvoie un tableau vide:
[]
Je suis à l'aide de JQuery 1.5.2. J'ai aussi essayé avec $.each (), mais avec pas de chance.
Apparemment, la plupart des méthodes JQuery sont conçus pour une utilisation avec des éléments du DOM (comme filter()
.
Des idées sur la façon de réaliser cet objectif?
Vous devez vous connecter pour publier un commentaire.
ES6
Plus sur le
find
méthode ici.ES5
Note
jQuery $.grep (ou une autre fonction de filtrage) n'est pas la solution optimale.
La
$.grep
fonction de boucle à travers tous les éléments du tableau, même si la recherche de l'objet a déjà été constaté au cours de la boucle. À partir de jQuery grep documentation :vous devriez passer de référence sur l'élément dans la fonction grep:
Exemple
Personnellement, je utiliser une fonction générique qui fonctionne pour n'importe quelle propriété d'un tableau:
Tu viens de l'appeler comme ceci:
L'erreur est que vous ne pouvez pas utiliser
this
dans le grep, mais vous devez utiliser une référence à l'élément. Cela fonctionne:retourne:
Utiliser le Underscore.js findWhere fonction (http://underscorejs.org/#findWhere):
daily
serait égal à:Ici un violon: http://jsfiddle.net/spencerw/oqbgc21x/
À retourner plus d'un (si que vous avez eu plus de votre tableau) vous pouvez utiliser
_.where(...)
Meilleur, le plus Rapide est
Si votre tableau est en fait un ensemble de JQuery objets, que pensez simplement à l'aide de la .filtre() méthode ?
La solution:
À l'aide de:
firstOrNull([{ a: 1, b: 2 }, { a: 3, b: 3 }], function(item) { return item.a === 3; });
Cette fonction ne s'exécute pour chaque élément du tableau (il a de la valeur pour les grands tableaux)
J'ai créé un util de service pour mon angulaire de l'application. Il ont deux fonction qui utilise très souvent.
Par exemple, vous avez de l'objet.
De la première mise en valeur de l'objet de manière récursive, sans jeter non défini erreur.
{prop: { nestedProp1: {nestedProp2: somevalue}}};
obtenir nestedProp2 2 sans undefined contrôles.
Deuxième matrice de filtre sur la base
[{prop: { nestedProp1: {nestedProp2: somevalue1}}}, {prop: { nestedProp1: {nestedProp2: somevalue2}}}];
De trouver l'objet de tableau avec nestedProp2=somevalue2
Pour solution pour la question en cours. injecter UtilService et d'appel,
Ou plus avancé
Javascript a une fonction pour ça: Tableau.le prototype.trouver. À titre d'exemple
- Il pas difficile de s'étend le rappel d'une fonction. Cependant, ce n'est pas compatible avec IE (et partiellement avec le Bord). Pour une liste complète de regarder la Compatibilité Du Navigateur
copié à partir de polyfill de la Matrice.le prototype.trouver le code de la Matrice.trouver, et a ajouté le tableau en tant que premier paramètre.
vous pouvez passer le terme de recherche comme fonction de prédicat
JS: