Utilisez la find()
méthode:
myArray.find(x => x.id === '45').foo;
De MDN :
La find()
méthode renvoie la première valeur du tableau si un élément du tableau satisfait la fonction de test fournie. Sinon undefined
est retourné.
Si vous souhaitez plutôt trouver son index , utilisezfindIndex()
:
myArray.findIndex(x => x.id === '45');
De MDN :
le findIndex()
méthode renvoie l'index du premier élément du tableau qui satisfait la fonction de test fournie. Sinon, -1 est renvoyé.
Si vous souhaitez obtenir un tableau d'éléments correspondants, utilisez le filter()
plutôt méthode:
myArray.filter(x => x.id === '45');
Cela renverra un tableau d'objets. Si vous souhaitez obtenir un tableau de foo
propriétés, vous pouvez le faire avec la map()
méthode:
myArray.filter(x => x.id === '45').map(x => x.foo);
Remarque: les méthodes comme find()
ou filter()
et les fonctions fléchées ne sont pas prises en charge par les anciens navigateurs (comme IE), donc si vous souhaitez prendre en charge ces navigateurs, vous devez transpiler votre code à l'aide de Babel (avec le polyfill ).
Michał Perłakowski
la source
Comme vous utilisez déjà jQuery, vous pouvez utiliser la fonction grep qui est destinée à rechercher un tableau:
Le résultat est un tableau avec les éléments trouvés. Si vous savez que l'objet est toujours là et qu'il ne se produit qu'une seule fois, vous pouvez simplement utiliser
result[0].foo
pour obtenir la valeur. Sinon, vous devez vérifier la longueur du tableau résultant. Exemple:la source
===
place de==
, pour éviter des problèmes étranges avec l'==
opérateur JavaScript .e.id
etid
seront des chaînes, je suppose qu'il est autorisé à utiliser==
. Mais si vous n'êtes pas sûr, vous pourriez rencontrer des problèmes (puisque'' == 0
c'esttrue
mais'' === 0
estfalse
). Sans oublier qu'il===
semble être plus rapide ( stackoverflow.com/questions/359494/… ).===
car il fonctionne exactement comme==
dans d'autres langages de programmation. Je considère==
comme inexistant en JavaScript.Une autre solution consiste à créer un objet de recherche:
Ceci est particulièrement intéressant si vous devez effectuer de nombreuses recherches.
Cela n'aura pas besoin de beaucoup plus de mémoire car les ID et les objets seront partagés.
la source
lookup
objet est une perte de temps.ECMAScript 2015 fournit la méthode find () sur les tableaux:
Il fonctionne sans bibliothèques externes. Mais si vous voulez un support de navigateur plus ancien, vous voudrez peut-être inclure ce polyfill .
la source
myArray.find(d=>d.id===45).foo;
.myArray.find(({ id }) => id === 45).foo
. Mais c'est une ancienne réponse qui a été écrite avant que la syntaxe ES2015 ne soit aussi bien prise en charge que maintenant. La réponse de @ Gothdo est actuellement la plus récente du fil.myArray.find(d => d.id === 45)?.foo
.Underscore.js a une belle méthode pour cela:
la source
Je pense que le moyen le plus simple serait le suivant, mais cela ne fonctionnera pas sur Internet Explorer 8 (ou version antérieure):
la source
for
?for
boucle directe .for
boucle se terminera lors de la première correspondance.id
Essayez ce qui suit
la source
la source
Une version générique et plus flexible de la fonction findById ci-dessus:
la source
Vous pouvez l'obtenir facilement en utilisant la fonction map () :
Exemple de travail: http://jsfiddle.net/hunter/Pxaua/
la source
map
supprime automatiquement lesnull
éléments. Cela semble trompeur pour moi et pour le concept commun demap
, car le résultat n'est pas de la même longueur que la collection originale.Vous pouvez utiliser des filtres,
la source
Bien qu'il existe de nombreuses réponses correctes ici, beaucoup d'entre elles n'abordent pas le fait qu'il s'agit d'une opération inutilement coûteuse si elle est effectuée plusieurs fois. Dans un cas extrême, cela pourrait être la cause de réels problèmes de performances.
Dans le monde réel, si vous traitez beaucoup d'éléments et que les performances sont une préoccupation, il est beaucoup plus rapide de créer initialement une recherche:
vous pouvez ensuite accéder aux éléments dans un délai fixe comme celui-ci:
Vous pouvez également envisager d'utiliser une carte au lieu d'un objet comme recherche: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
la source
Utilisation native
Array.reduce
renvoie l'élément objet s'il est trouvé, sinon
false
la source
Si vous effectuez cette opération plusieurs fois, vous pouvez configurer une carte (ES6):
Ensuite, vous pouvez simplement faire:
la source
Voici comment j'y arriverais en JavaScript pur, de la manière la plus minimale que je puisse penser qui fonctionne dans ECMAScript 3 ou version ultérieure. Il revient dès qu'une correspondance est trouvée.
la source
Plus générique et court
dans votre cas Ex.
var element = findFromArray(myArray,'id',45)
cela vous donnera l'élément entier.la source
Vous pouvez essayer Sugarjs sur http://sugarjs.com/ .
Il a une méthode très douce sur les tableaux,
.find
. Vous pouvez donc trouver un élément comme celui-ci:Vous pouvez également lui passer un objet avec plus de propriétés pour ajouter une autre "clause where".
Notez que Sugarjs étend les objets natifs, et certaines personnes considèrent cela très mal ...
la source
find
. Ma suggestion est que si vous souhaitez étendre des prototypes natifs, utilisez toujours des noms plus spécifiques, en laissant les plus simples aux futurs développements standard.S'appuyant sur la réponse acceptée:
jQuery:
Ou CoffeeScript:
la source
Récemment, je dois faire face à la même chose dans laquelle je dois rechercher la chaîne à partir d'un énorme tableau.
Après quelques recherches, j'ai trouvé que ce serait facile à manipuler avec un code simple:
Code:
Voir https://jsfiddle.net/maheshwaghmare/cfx3p40v/4/
la source
Itérer sur n'importe quel élément du tableau. Pour chaque élément que vous visitez, vérifiez l'ID de cet élément. Si c'est un match, retournez-le.
Si vous voulez juste le codez:
Et la même chose en utilisant les méthodes de tableau d'ECMAScript 5:
la source
Tant que le navigateur prend en charge ECMA-262 , 5e édition (décembre 2009), cela devrait fonctionner, presque à une ligne:
la source
bFound
est juste un booléentrue
si un élément satisfait la condition requise.Vous pouvez le faire même en JavaScript pur en utilisant la fonction de "filtre" intégrée pour les tableaux:
Alors maintenant, passez simplement "id" à la place de
key
et "45" à la place devalue
, et vous obtiendrez l'objet complet correspondant à un id de 45. Ce serait donc,la source
Utilisez la
Array.prototype.filter()
fonction.DÉMO : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/
JSON
FILTRE
la source
.filter
méthodeobj.info
dans la boucle imbriquée.var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
Nous pouvons utiliser les méthodes Jquery
$.each()/$.grep()
ou
utilisez la syntaxe ES6:
Ou utilisez Lodash https://lodash.com/docs/4.17.10#filter , Underscore https://underscorejs.org/#filter
la source
J'ai vraiment aimé la réponse fournie par Aaron Digulla mais je devais garder mon tableau d'objets afin de pouvoir le parcourir plus tard. Je l'ai donc modifié pour
la source
Utilisation:
Il doit retourner un objet par id.
la source
Cette solution peut également être utile:
Je l'ai fait comme
$.grep
et si un objet est découvert, la fonction retournera l'objet, plutôt qu'un tableau.la source
function will return the object, rather than an array
pourrait y avoir une erreur, mais je pense que cela dépend des utilisateurs.A partir de la réponse de aggaton , ceci est une fonction qui renvoie en fait l'élément voulu (ou
null
si elle est introuvable), étant donné laarray
et unecallback
fonction qui retourne une valeur de truthy pour l'élément « correct »:N'oubliez pas que cela ne fonctionne pas nativement sur IE8-, car il ne prend pas en charge
some
. Un polyfill peut être fourni, alternativement il y a toujours lafor
boucle classique :C'est en fait plus rapide et plus compact. Mais si vous ne voulez pas réinventer la roue, je suggère d'utiliser une bibliothèque d'utilitaires comme le soulignement ou le lodash.
la source
Le plus court,
la source
Considérez "axesOptions" comme un tableau d'objets avec un format d'objet étant {: field_type => 2,: fields => [1,3,4]}
la source