Quelle est la meilleure méthode pour obtenir l'index d'un tableau contenant des objets?
Imaginez ce scénario:
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello,qaz);
Maintenant, je voudrais avoir l' indexOf
objet dont la hello
propriété est 'stevie'
qui, dans cet exemple, serait 1
.
Je suis assez novice avec JavaScript et je ne sais pas s'il existe une méthode simple ou si je dois créer ma propre fonction pour le faire.
javascript
Antonio Laguna
la source
la source
hello
etqaz
?var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor); var objectFound = array[elementPos];
[link] ( stackoverflow.com/a/16100446/1937255 )Réponses:
Je pense que vous pouvez le résoudre en une seule ligne en utilisant la fonction de carte :
la source
Array.prototype.map()
Array.prototype.findIndex est pris en charge dans tous les navigateurs autres qu'IE (non-edge). Mais le polyfill fourni est agréable.
La solution avec la carte est correcte. Mais vous parcourez l'ensemble du tableau à chaque recherche. Ce n'est que le pire des cas pour findIndex qui cesse d'itérer une fois qu'une correspondance est trouvée.
Il n'y a pas vraiment de manière concise(lorsque les développeurs devaient se soucier d'IE8) , mais voici une solution courante:ou en fonction:
Juste quelques notes:
Par exemple,
la source
Dans ES2015, c'est assez simple:
ou, probablement avec de meilleures performances pour les baies plus grandes:
la source
la source
J'aime la réponse de Pablo, mais Array # indexOf et Array # map ne fonctionnent pas sur tous les navigateurs. Underscore utilisera du code natif s'il est disponible, mais a également des solutions de rechange. De plus, il a la méthode pluck pour faire exactement ce que fait la méthode de carte anonyme de Pablo.
la source
chain
est superflu ici._.pluck(myArray, 'hello').indexOf('stevie')
Ou prototype:
la source
Array.prototype.indexOfObject = function(property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; };
if (typeof property === 'string' || typeof property === 'number' || typeof property === 'boolean') return oldIndexOf(property, value);
. C'est parce que ce sont les quelques types qui sont immuables. Je présenterais également un troisième argument pour permettre le retour à la méthode native si nécessaire.Bref
Cas d'utilisation:
API:
la source
J'ai fait quelques tests de performances de différentes réponses ici, que tout le monde peut exécuter eux-mêmes:
https://jsperf.com/find-index-of-object-in-array-by-contents
D'après mes premiers tests dans Chrome, la méthode suivante (en utilisant une boucle for configurée dans un prototype) est la plus rapide:
Ce code est une version légèrement modifiée de la réponse de Nathan Zaetta.
Dans les tests de performances, je l'ai essayé avec à la fois la cible au milieu (index 500) et à la fin (index 999) d'un tableau d'objets 1000, et même si je mets la cible en tant que tout dernier élément du tableau (ce qui signifie qu'il doit parcourir chaque élément du tableau avant qu'il ne soit trouvé), il finit toujours par être le plus rapide.
Cette solution a également l'avantage d'être l'une des plus laconiques pour une exécution répétée, car seule la dernière ligne doit être répétée:
la source
while
boucle au lieu d'unefor
, etperformance.now()
. J'aurais aimé que cette réponse soit plus votée et que je l'ai vue plus tôt, cela m'aurait fait gagner du temps ...J'ai comparé plusieurs méthodes et obtenu un résultat avec le moyen le plus rapide pour résoudre ce problème. C'est une
for
boucle. C'est 5 fois plus rapide que toute autre méthode.Voici la page du test: https://jsbench.me/9hjewv6a98
la source
for-of
boucle non?Bien que la plupart des autres réponses ici soient valides. Parfois, il est préférable de créer une fonction simple et courte près de l'endroit où vous allez l'utiliser.
Cela dépend de ce qui est important pour vous. Cela pourrait économiser des lignes de code et être très intelligent pour utiliser une seule ligne, ou pour mettre une solution générique quelque part qui couvre divers cas de bord. Mais parfois, il vaut mieux simplement dire: «ici, je l'ai fait comme ça» plutôt que de laisser les futurs développeurs faire un travail d'ingénierie inverse supplémentaire. Surtout si vous vous considérez comme un "débutant" comme dans votre question.
la source
Attention au
[0]
.Il convient d'utiliser
reduce
comme dansAntonio Laguna
la réponse de.Toutes mes excuses pour la brièveté ...
la source
Si votre objet est le même objet que ceux que vous utilisez dans le tableau, vous devriez pouvoir obtenir l'index de l'objet de la même manière que si c'était une chaîne.
la source
Essaye ça:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
la source
Facile:
la source
Si vous souhaitez uniquement trouver le poste, consultez la réponse de @ Pablo .
pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
Cependant, si vous avez hâte de trouver l'élément (c'est-à-dire si vous envisagez de faire quelque chose comme ça
myArray[pos]
), il existe un moyen plus efficace de le faire sur une seule ligne , en utilisantfilter
.element = myArray.filter((e) => e.hello === 'stevie')[0];
Voir les résultats de performance (~ + 42% ops / sec): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3
la source
Voir cet exemple: http://jsfiddle.net/89C54/
Il commence à compter avec zéro.
la source
J'ai créé une fonction générique pour vérifier le code ci-dessous et fonctionne pour n'importe quel objet
La première alerte renverra -1 (signifie que la correspondance n'est pas trouvée) et la deuxième alerte renverra 0 (signifie que la correspondance a été trouvée).
la source
Utilisation à
_.findIndex
partir de la bibliothèque underscore.jsVoici l'exemple
_.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1
la source
En utilisant la
findIndex
méthode ES6 , sans lodash ni aucune autre bibliothèque, vous pouvez écrire:Cela comparera les propriétés immédiates de l'objet, mais ne récursif dans les propriétés.
Si votre implémentation ne fournit pas
findIndex
encore (la plupart ne le font pas), vous pouvez ajouter un polyfill léger qui prend en charge cette recherche:(d'après ma réponse sur ce dupe )
la source
Vous pouvez utiliser une fonction native et pratique
Array.prototype.findIndex()
essentiellement:Juste une note, il n'est pas pris en charge sur Internet Explorer, Opera et Safari, mais vous pouvez utiliser un Polyfill fourni dans le lien ci-dessous.
Plus d'information:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex
la source
En plus de la réponse de @Monika Garg , vous pouvez utiliser
findIndex()
(Il existe un polyfill pour les navigateurs non pris en charge).J'ai vu que les gens ont rejeté cette réponse, et j'espère qu'ils l'ont fait à cause d'une mauvaise syntaxe, car à mon avis, c'est la manière la plus élégante.
Par exemple:
la source
C'est la façon de trouver l'index de l'objet dans le tableau
la source
Cela fonctionne sans code personnalisé
la source
Vous pouvez simplement utiliser
Pas de soulignement, pas de, juste une réduction.
la source
la source
Vous pouvez créer votre propre prototype pour ce faire:
quelque chose comme:
la source
Je préférerai utiliser la
findIndex()
méthode:index
vous donnera le numéro d'index.la source