La .indexOf()
méthode a un deuxième paramètre facultatif qui spécifie l'index à partir duquel commencer la recherche, vous pouvez donc l'appeler dans une boucle pour trouver toutes les instances d'une valeur particulière:
function getAllIndexes(arr, val) {
var indexes = [], i = -1;
while ((i = arr.indexOf(val, i+1)) != -1){
indexes.push(i);
}
return indexes;
}
var indexes = getAllIndexes(Cars, "Nano");
Vous n'indiquez pas vraiment comment vous voulez utiliser les index, donc ma fonction les renvoie sous forme de tableau (ou renvoie un tableau vide si la valeur n'est pas trouvée), mais vous pouvez faire autre chose avec les valeurs d'index individuelles à l'intérieur de la boucle.
MISE À JOUR: Selon le commentaire de VisioN, une simple boucle for ferait le même travail plus efficacement, et il est plus facile à comprendre et donc plus facile à maintenir:
function getAllIndexes(arr, val) {
var indexes = [], i;
for(i = 0; i < arr.length; i++)
if (arr[i] === val)
indexes.push(i);
return indexes;
}
for
boucle unique avec un tableau d'indexation..indexOf()
je voulais montrer qu'il peut faire le travail. (Je suppose que j'ai pensé que l'OP pourrait trouver comment le faire avec une boucle for.) Bien sûr, il existe d'autres moyens de le faire, par exempleCars.reduce(function(a, v, i) { if (v==="Nano") a.push(i); return a; }, []);
indexes
au lieu deindices
: PUne autre solution alternative consiste à utiliser
Array.prototype.reduce()
:NB: Vérifiez la compatibilité du navigateur pour la
reduce
méthode et utilisez polyfill si nécessaire.la source
:)
Ouais, j'ai pensé que çareduce
pourrait être une bonne alternative.array.reduce((a, e, i) => (e === value) ? a.concat(i) : a, [])
contat
est plus lent quepush
, donc je m'en tiens à la réponse.Une autre approche utilisant Array.prototype.map () et Array.prototype.filter () :
la source
map(…)
vérifie à chaque itération l'égalité dee
etvalue
. Lorsqu'ils correspondent, l'index est renvoyé, sinon une chaîne vide. Pour se débarrasser de ces valeurs fausses,filter(String)
assurez-vous que le résultat ne contient que des valeurs de type chaîne et NON vides.filter(String)
pourrait aussi s'écrire:filter(e => e !== '')
String(thing)
contraint quoi que ce soit à une chaîne.Array#filter
renvoie un tableau de toutes les valeurs pour lesquelles la condition est véridique . Étant donné que les chaînes vides sont fausses , elles ne sont PAS incluses dans le tableau.Une manière plus simple avec le style es6.
la source
Vous pouvez écrire une solution simple et lisible à cela en utilisant à la fois
map
etfilter
:EDIT: Si vous n'avez pas besoin de prendre en charge IE / Edge (ou si vous transpilez votre code), ES2019 nous a donné flatMap , qui vous permet de le faire en une seule ligne:
la source
Remarque: MDN donne une méthode utilisant une boucle while :
Je ne dirais pas que c'est mieux que d'autres réponses. Juste intéressant.
la source
Je veux juste mettre à jour avec une autre méthode simple.
Vous pouvez également utiliser la méthode forEach.
la source
la source
Cela a fonctionné pour moi:
la source
Juste pour partager une autre méthode, vous pouvez également utiliser des générateurs de fonctions pour obtenir le résultat:
la source
Nous pouvons utiliser Stack et pousser "i" dans la pile chaque fois que nous rencontrons la condition "arr [i] == value"
Vérifie ça:
la source
javascript
, tandis que votre réponse estJava
je crois?la source
Vous pouvez utiliser Polyfill
}
Utilisez-le comme ceci:
la source
findIndex
récupère uniquement le premier index qui correspond à la sortie de rappel. Vous pouvez implémenter le vôtrefindIndexes
en étendant Array, puis en convertissant vos tableaux dans la nouvelle structure.la source
Si vous avez l'intention d'utiliser un trait de soulignement / lodash, vous pouvez faire
la source
(["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"]).map((v, i)=> [i, v === "Nano"]).filter(v=>v[1]).map(v=>v[0])