J'ai un tableau comme celui-ci:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
Comment puis-je obtenir l'index de l'objet qui correspond à une condition, sans itérer sur l'ensemble du tableau?
Par exemple, étant donné prop2=="yutu"
, je veux obtenir l'index 1
.
J'ai vu .indexOf()
mais je pense que c'est utilisé pour des tableaux simples comme ["a1","a2",...]
. J'ai également vérifié $.grep()
mais cela renvoie des objets, pas l'index.
la source
0
?). Les deux solutions font plus d'itérations que nécessaire, ce qui n'est pas idéal si le tableau est grand (bien que les chances qu'il soit si grand qu'un humain le remarquerait sont faibles, à moins que les recherches ne se produisent souvent ).x => x.prop2=="yutu"
fonctionne findIndex ()?function(x) { return x.prop2=="yutu" }
index = a.findIndex(function (x) { return x.prop2 == "yutu" })
corrigé le problème afin qu'avec le code polyfill, findIndex fonctionne dans IE11Vous ne pouvez pas, quelque chose doit parcourir le tableau (au moins une fois).
Si la condition change beaucoup, vous devrez parcourir et regarder les objets qui s'y trouvent pour voir s'ils correspondent à la condition. Cependant, sur un système avec des fonctionnalités ES5 (ou si vous installez un shim), cette itération peut être effectuée de manière assez concise:
Qui utilise la nouvelle (ish)
Array#some
fonction , qui fait une boucle à travers les entrées du tableau jusqu'à ce que la fonction que vous lui donnez retourne vrai. La fonction que je lui ai donnée enregistre l'index de l'entrée correspondante, puis revienttrue
pour arrêter l'itération.Ou bien sûr, utilisez simplement une
for
boucle. Vos différentes options d'itération sont couvertes dans cette autre réponse .Mais si vous allez toujours utiliser la même propriété pour cette recherche et si les valeurs de propriété sont uniques, vous pouvez boucler une seule fois et créer un objet pour les mapper:
(Ou, encore une fois, vous pouvez utiliser une
for
boucle ou l'une de vos autres options .)Ensuite, si vous avez besoin de trouver l'entrée avec
prop2 = "yutu"
, vous pouvez le faire:J'appelle cela "l'indexation croisée" du tableau. Naturellement, si vous supprimez ou ajoutez des entrées (ou modifiez leurs
prop2
valeurs), vous devez également mettre à jour votre objet de mappage.la source
thg435
fait ce que je voulais ...Ce que TJ Crowder a dit, chaque fois aura une sorte d'itération cachée, avec lodash cela devient:
la source
Et pour les numéros de tableau de base, vous pouvez également faire ceci:
Vous obtiendrez -1 s'il ne trouve pas de valeur dans le tableau.
la source
Itérer sur tous les éléments du tableau. Il retourne soit l'index et true ou false si la condition ne correspond pas.
Important est la valeur de retour explicite de true (ou une valeur dont le résultat booléen est true). L'affectation unique n'est pas suffisante, en raison d'un index possible avec 0 (Boolean (0) === false), ce qui ne résulterait pas en une erreur mais désactiverait la rupture de l'itération.
Éditer
Une version encore plus courte de ce qui précède:
la source
|
, c'est une version courte d'obtenir à partir d'un index (avec -1) un résultat véridique / falsifié , si un index existe.~
elle ne fonctionne pas comme ça.!!(index = 0)
et la!!~(index = 0)
différence en effet. Merci!Vous pouvez utiliser Array.prototype.some () de la manière suivante (comme mentionné dans les autres réponses):
https://jsfiddle.net/h1d69exj/2/
la source
J'ai vu de nombreuses solutions dans ce qui précède.
Ici, j'utilise la fonction de carte pour trouver l'index du texte de recherche dans un objet tableau.
Je vais expliquer ma réponse en utilisant les données des étudiants.
étape 1 : créer un objet tableau pour les étudiants (facultatif, vous pouvez créer votre propre objet tableau).
var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];
étape 2 : créer une variable pour rechercher du texte
var studentNameToSearch = "Divya";
étape 3 : Créer une variable pour stocker l'index correspondant (ici, nous utilisons la fonction de carte pour itérer).
var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);
la source
la source
Pourquoi ne voulez-vous pas répéter exactement? Les nouveaux Array.prototype.forEach sont parfaits à cet effet!
Vous pouvez utiliser un arbre de recherche binaire pour rechercher via un seul appel de méthode si vous le souhaitez. Il s'agit d'une implémentation soignée de l'arbre de recherche BTree et Red black dans JS - https://github.com/vadimg/js_bintrees - mais je ne sais pas si vous pouvez trouver l'index en même temps.
la source
Une étape en utilisant Array.reduce () - pas de jQuery
retournera
null
si l'index n'a pas été trouvé.la source
la source
Georg a déjà mentionné que ES6 avait Array.findIndex pour cela. Et certaines autres réponses sont une solution de contournement pour ES5 en utilisant la méthode Array.some.
Une approche plus élégante peut être
Dans le même temps, je tiens à souligner que Array.some peut être implémenté avec une technique de recherche binaire ou efficace. Ainsi, il pourrait mieux fonctionner en boucle dans certains navigateurs.
la source
Essayez ce code
la source