Jquery comment trouver un object par atsortingbut dans un tableau

Étant donné que j’ai un tableau d’objects “purpose”:

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

(pour simplifier, j’omets d’autres atsortingbuts)

Maintenant, je veux avoir une méthode qui renvoie un object spécifique si un nom d’objective correspondant est trouvé.

Cela ne fonctionne pas:

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

mais il retourne en réalité un tableau vide:

 [] 

J’utilise JQuery 1.5.2. J’ai aussi essayé avec $ .each () mais sans succès. Apparemment, la plupart des méthodes JQuery sont conçues pour être utilisées avec des éléments DOM (tels que filter() .

Des idées sur la façon d’y parvenir?

    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 } 

    Remarque

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

    La fonction $.grep va parcourir tous les éléments du tableau, même si l’object recherché a déjà été trouvé pendant la boucle. De la documentation de jQuery grep:

    La méthode $ .grep () supprime les éléments d'un tableau si nécessaire afin que tous les éléments restants réussissent un test fourni. Le test est une fonction à laquelle est passé un élément de tableau et l'index de l'élément dans le tableau. Ce n'est que si le test renvoie true que l'élément sera dans le tableau de résultats.

    vous devriez passer la référence sur l’élément dans la fonction grep:

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

    Exemple

    Personnellement, j’utilise une fonction plus générique qui fonctionne pour toute propriété de tout tableau:

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

    Vous appelez juste comme ceci:

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

    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"}] 

    Utilisez la fonction Underscore.js findWhere ( http://underscorejs.org/#findWhere ):

     var purposeObjects = [ {purpose: "daily"}, {purpose: "weekly"}, {purpose: "monthly"} ]; var daily = _.findWhere(purposeObjects, {purpose: 'daily'}); 

    daily serait égal à:

     {"purpose":"daily"} 

    Voici un violon: http://jsfiddle.net/spencerw/oqbgc21x/

    Pour retourner plus d’un ( si vous aviez plus dans votre tableau), vous pouvez utiliser _.where(...)

    Le meilleur, le plus rapide est

     function arrayLookup(array, prop, val) { for (var i = 0, len = array.length; i < len; i++) { if (array[i].hasOwnProperty(prop) && array[i][prop] === val) { return array[i]; } } return null; } 

    Si votre tableau est en fait un ensemble d’objects JQuery, pourquoi ne pas utiliser simplement la méthode .filter () ?

     purposeObjects.filter('[purpose="daily"]') 

    Une solution de plus:

     function firstOrNull(array, expr) { for (var i = 0; i < array.length; i++) { if (expr(array[i])) return array[i]; } return null; } 

    Using: firstOrNull([{ a: 1, b: 2 }, { a: 3, b: 3 }], function(item) { return item.a === 3; });

    Cette fonction ne s'exécute pas pour chaque élément du tableau (c'est important pour les grands tableaux)

    J’ai créé un service util pour mon application angular. Il a deux fonctions qui utilisent très souvent.

    Par exemple, vous avez un object.

    Obtenir d’abord la valeur de l’object de manière récursive sans générer d’erreur non définie.

    {prop: {nestedProp1: {nestedProp2: somevalue}}}; obtenir nestedProp2 2 sans vérification indéfinie.

    Deuxième masortingce de filtres sur la base

    [{prop: {nestedProp1: {nestedProp2: somevalue1}}}, {prop: {nestedProp1: {nestedProp2: somevalue2}}}];

    Rechercher un object à partir d’un tableau avec nestedProp2 = somevalue2

     app.service('UtilService', function(httpService) { this.mapSsortingngKeyVal = function(map, field) { var lastIdentifiedVal = null; var parentVal = map; field.split('.').forEach(function(val){ if(parentVal[val]){ lastIdentifiedVal = parentVal[val]; parentVal = parentVal[val]; } }); return lastIdentifiedVal; } this.arrayPropFilter = function(array, field,value) { var lastIdentifiedVal = null; var mapSsortingngKeyVal = this.mapSsortingngKeyVal; array.forEach(function(arrayItem){ var valueFound = mapSsortingngKeyVal(arrayItem,field); if(!lastIdentifiedVal && valueFound && valueFound==value){ lastIdentifiedVal = arrayItem; } }); return lastIdentifiedVal; }}); 

    Pour la solution pour la question actuelle. injecter UtilService et appeler,

     UtilService.arrayPropFilter(purposeArray,'purpose','daily'); 

    Ou plus avancé

     UtilService.arrayPropFilter(purposeArray,'purpose.nestedProp1.nestedProp2','daily'); 

    Javascript a une fonction pour cela: Array.prototype.find . Comme exemple

     function isBigEnough(element) { return element >= 15; } [12, 5, 8, 130, 44].find(isBigEnough); // 130 

    Il n’est pas difficile d’étendre le rappel à une fonction. Cependant, ce n’est pas compatible avec IE (et partiellement avec Edge). Pour une liste complète, consultez la compatibilité du navigateur.