Die .indexOf()
Methode verfügt über einen optionalen zweiten Parameter, der den Index angibt, von dem aus die Suche gestartet werden soll. Sie können ihn also in einer Schleife aufrufen, um alle Instanzen eines bestimmten Werts zu finden:
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");
Sie machen nicht wirklich klar, wie Sie die Indizes verwenden möchten, daher gibt meine Funktion sie als Array zurück (oder gibt ein leeres Array zurück, wenn der Wert nicht gefunden wird), aber Sie könnten mit den einzelnen Indexwerten etwas anderes tun innerhalb der Schleife.
UPDATE: Gemäß dem Kommentar von VisioN würde eine einfache for-Schleife den gleichen Job effizienter erledigen, und es ist einfacher zu verstehen und daher einfacher zu warten:
function getAllIndexes(arr, val) {
var indexes = [], i;
for(i = 0; i < arr.length; i++)
if (arr[i] === val)
indexes.push(i);
return indexes;
}
for
Schleife mit ausgefülltem Indexarray zu sein..indexOf()
wollte ich zeigen, dass es die Aufgabe erfüllen kann. (Ich denke, ich dachte, das OP könnte herausfinden, wie es mit einer for-Schleife gemacht wird.) Natürlich gibt es auch andere Möglichkeiten, z. B.Cars.reduce(function(a, v, i) { if (v==="Nano") a.push(i); return a; }, []);
indexes
anstelle vonindices
: PEine andere alternative Lösung ist die Verwendung von
Array.prototype.reduce()
:NB: Überprüfen Sie die Browserkompatibilität für die
reduce
Methode und verwenden Sie bei Bedarf Polyfill .quelle
:)
Ja, ich dachte, vielleichtreduce
könnte eine schöne Alternative sein.array.reduce((a, e, i) => (e === value) ? a.concat(i) : a, [])
contat
ist langsamer alspush
, deshalb bleibe ich bei der Antwort.Ein anderer Ansatz mit Array.prototype.map () und Array.prototype.filter () :
quelle
map(…)
überprüft bei jeder Iteration die Gleichheit vone
undvalue
. Wenn sie mit dem Index übereinstimmen, wird eine leere Zeichenfolge zurückgegeben. Stellen Siefilter(String)
sicher, dass das Ergebnis nur Werte enthält, die vom Typ Zeichenfolge sind und NICHT leer , um diese falschen Werte zu entfernen .filter(String)
könnte auch geschrieben werden als:filter(e => e !== '')
String(thing)
zwingt irgendetwas zu einer Zeichenfolge. GibtArray#filter
ein Array aller Werte zurück, für die die Bedingung wahr ist . Da leere Zeichenfolgen falsch sind , sind diese NICHT im Array enthalten.Einfacher Weg mit es6-Stil.
quelle
Sie können eine einfache lesbare Lösung dafür schreiben, indem Sie sowohl
map
als auchfilter
:BEARBEITEN: Wenn Sie IE / Edge nicht unterstützen müssen (oder Ihren Code transpilieren), hat uns ES2019 flatMap zur Verfügung gestellt , mit der Sie dies in einem einfachen Einzeiler tun können:
quelle
Hinweis: MDN gibt eine Methode mit einer while-Schleife an :
Ich würde nicht sagen, dass es besser ist als andere Antworten. Nur interessant.
quelle
Ich möchte nur mit einer anderen einfachen Methode aktualisieren.
Sie können auch die forEach-Methode verwenden.
quelle
quelle
Das hat bei mir funktioniert:
quelle
Um eine andere Methode zu teilen, können Sie auch Funktionsgeneratoren verwenden , um das Ergebnis zu erzielen:
quelle
Wir können Stack verwenden und "i" jedes Mal in den Stack schieben, wenn wir auf die Bedingung "arr [i] == value" stoßen.
Überprüfen Sie dies:
quelle
javascript
, während Ihre AntwortJava
ich glaube?quelle
Sie können Polyfill verwenden
}}
Verwenden Sie es so:
quelle
findIndex
Ruft nur den ersten Index ab, der der Rückrufausgabe entspricht. Sie können Ihr eigenes implementieren,findIndexes
indem Sie Array erweitern und dann Ihre Arrays in die neue Struktur umwandeln.quelle
Wenn Sie Unterstrich / lodash verwenden möchten, können Sie dies tun
quelle
(["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"]).map((v, i)=> [i, v === "Nano"]).filter(v=>v[1]).map(v=>v[0])