J'ai surfé un peu partout pour essayer de trouver un moyen efficace de le faire, mais je n'ai abouti à rien. J'ai un tableau d'objets qui ressemble à ceci:
array[i].id = some number;
array[i].name = some name;
Ce que je veux faire est de trouver les INDEXES des objets où id est égal, par exemple, à 0,1,2,3 ou 4. Je suppose que je pourrais simplement faire quelque chose comme:
var indexes = [];
for(i=0; i<array.length; i++) {
(array[i].id === 0) ? { indexes[0] = i }
(array[i].id === 1) ? { indexes[1] = i }
(array[i].id === 2) ? { indexes[2] = i }
(array[i].id === 3) ? { indexes[3] = i }
(array[i].id === 4) ? { indexes[4] = i }
}
Bien que cela fonctionne, cela semble être assez cher et lent (pour ne pas dire moche), surtout si array.length peut être volumineux. Des idées pour embellir un peu cela? J'ai pensé à utiliser array.indexOf d'une manière ou d'une autre, mais je ne vois pas comment forcer la syntaxe. Ce
array.indexOf(this.id === 0);
par exemple, renvoie undefined, comme il se doit. Merci d'avance!
javascript
arrays
indexof
Petrov
la source
la source
Array.prototype.findIndex()
dans ECMAScript 2015. La réponse acceptée était géniale.Réponses:
Vous aimeriez peut-être utiliser des fonctions d'ordre supérieur telles que "map". En supposant que vous souhaitiez effectuer une recherche par attribut "champ":
la source
function hashf(el) { return String(el.id) + "_" + String(el.name); }
. Ceci est juste un indice: deelementPos = array.map(hashf(x)).indexOf(hash({id:3, name:'Pablo'}));
toute évidence, la fonction de hachage que je fournis n'est pas valide dans tous les cas car elle'_'
pourrait faire partie de vos valeurs, mais ce n'est qu'un exemple rapide que vous pouvez comprendre différentes méthodes de hachage.indexOf
valeur de retour quand il ne peut pas localiser une valeur donnée.map, indexOf
vous pouvez en utiliser une seule appeléefindIndex
....... Ex:[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3}) OR [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
Le moyen le plus simple et le plus simple de trouver l'index d'élément dans un tableau.
Syntaxe ES5:
[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})
Syntaxe ES6:
[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
la source
findIndex
sur developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…obj.id == 3
opérateur utilisé ici peut provoquer une conversion de type inattendue, alors utilisezobj.id === 3
plutôt l' opérateur, qui teste la valeur et le type égaux.var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);
qu'il a fallu 0.03500000002532033 millisecondes l' aide[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
qu'il a fallu 0.00999999747378752 millisecondes.La nouvelle méthode Array .filter () fonctionnerait bien pour cela:
jQuery peut également le faire avec .grep ()
edit: il convient de mentionner que ces deux fonctions ne font qu'itérer sous le capot, il n'y aura pas de différence de performance notable entre elles et le roulement de votre propre fonction de filtre, mais pourquoi réinventer la roue.
la source
Si vous vous souciez de la performance, ne pas aller avec trouver ou filtre ou la carte ou l' une des méthodes décrites ci - dessus
Voici un exemple illustrant la méthode la plus rapide. ICI est le lien vers le test réel
Bloc de configuration
Méthode la plus rapide
Méthodes plus lentes
Méthode LA PLUS LENTE
la source
le résultat est une liste de recherche pour l'identifiant. avec l'identifiant donné, nous obtenons l'index de l'enregistrement.
la source
la source
Puisqu'il n'y a pas de réponse en utilisant un tableau régulier
find
:la source
Une nouvelle façon d'utiliser ES6
la source
picked_element
est un tableau dans ce cas ...const index = array.findIndex(item => item.id === 'your-id');
Cela devrait vous donner l'index de l'élément dans le tableau avec id === votre-id
la source
Il me semble que vous pourriez créer un itérateur simple avec un rappel pour les tests. Ainsi:
Ensuite, vous pouvez invoquer comme ceci:
la source
Adapter la réponse de Tejs pour mongoDB et Robomongo j'ai changé
à
la source
Utilisation de la
map
fonction ES6 :la source
Pour résumer toutes les bonnes réponses ci-dessus et en plus de ma réponse concernant trouver tous les index proviennent de certains des commentaires.
la source
Comme je ne peux pas encore commenter, je souhaite afficher la solution que j'ai utilisée en fonction de la méthode publiée par Umair Ahmed, mais lorsque vous souhaitez rechercher une clé au lieu d'une valeur:
Je comprends qu'il ne répond pas à la question élargie, mais le titre ne spécifie pas ce que l'on attendait de chaque objet, donc je veux partager humblement ceci pour éviter des maux de tête aux autres à l'avenir, alors que je ne démarre pas, ce n'est peut-être pas le solution la plus rapide.
la source
J'ai créé un petit utilitaire appelé super-array où vous pouvez accéder aux éléments d'un tableau par un identifiant unique avec une complexité O (1). Exemple:
la source
retournera l'indice 1 (fonctionne uniquement dans ES 2016)
la source
J'aime cette méthode car elle est facile à comparer à n'importe quelle valeur de l'objet, quelle que soit la profondeur de son imbrication.
la source