73 votes

Jquery comment trouver un objet par attribut dans un tableau

Étant donné que j'ai un tableau de "but" des objets:

//array of purpose objects:
var purposeObjects = [
    {purpose: "daily"},
    {purpose: "weekly"},
    {purpose: "monthly"}
];

(pour plus 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 le 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().

Toutes les idées sur la façon de réaliser cet objectif?

95voto

Luca Fagioli Points 2885

jQuery $.grep (ou une autre fonction de filtrage) n'est pas la solution optimale.

L' $.grep fonction passe en boucle sur 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 :

L' $.grep() la méthode supprime les éléments d'un tableau que nécessaire afin d' tous les éléments restants passer un test fourni. Le test est une fonction qui est passé d'un élément de tableau et l'index de l'élément dans le tableau. Seulement si le test renvoie vrai sera le point dans le tableau résultat.

C'est le moyen le plus rapide (et ça marche même sans jQuery):

var findPurpose = function(purposeName) {
    for (var i = 0, len = purposeObjects.length; i < len; i++) {
        if (purposeObjects[i].purpose === purposeName)
            return purposeObjects[i]; // Return as soon as the object is found
    }
    return null; // The object was not found
}

40voto

Andrei Points 2764

vous devriez passer la référence à item dans la fonction grep:

 function findPurpose(purposeName){
    return $.grep(purposeObjects, function(item){
      return item.purpose == purposeName;
    });
};
 

Exemple

33voto

Johann Points 3011

Personnellement, j'utilise une fonction plus générique qui fonctionne pour n'importe quelle propriété de n'importe quel tableau:

 function lookup(array, prop, value) {
    for (var i = 0, len = array.length; i < len; i++)
        if (array[i][prop] === value) return array[i];
}
 

Vous appelez ça comme ça:

 lookup(purposeObjects, "purpose", "daily");
 

29voto

Jesper Rønn-Jensen Points 15212

L'erreur était que vous ne pouvez pas utiliser this dans le grep, mais vous devez utiliser une référence à l'élément. Cela marche:

 function findPurpose(purposeName){
    return $.grep(purposeObjects, function(n, i){
      return n.purpose == purposeName;
    });
};

findPurpose("daily");
 

résultats:

 [Object { purpose="daily"}]
 

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