.indexOf()
Metoda ma opcjonalny drugi parametr, który określa indeks, aby rozpocząć wyszukiwanie od tak można nazwać to w pętli, aby znaleźć wszystkie wystąpienia określonej wartości:
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");
Naprawdę nie wyjaśniasz, jak chcesz używać indeksów, więc moja funkcja zwraca je jako tablicę (lub zwraca pustą tablicę, jeśli wartość nie zostanie znaleziona), ale możesz zrobić coś innego z indywidualnymi wartościami indeksu wewnątrz pętli.
AKTUALIZACJA: zgodnie z komentarzem VisioN, prosta pętla for wykonałaby to samo zadanie wydajniej i jest łatwiejsza do zrozumienia, a zatem łatwiejsza w utrzymaniu:
function getAllIndexes(arr, val) {
var indexes = [], i;
for(i = 0; i < arr.length; i++)
if (arr[i] === val)
indexes.push(i);
return indexes;
}
for
pętli z wypełnioną tablicą indeksów..indexOf()
, chciałem pokazać, że może wykonać zadanie. (Myślę, że pomyślałem, że OP może wymyślić, jak to zrobić za pomocą pętli for.) Oczywiście są inne sposoby, aby to zrobić, np.Cars.reduce(function(a, v, i) { if (v==="Nano") a.push(i); return a; }, []);
indexes
zamiastindices
: PInnym alternatywnym rozwiązaniem jest zastosowanie
Array.prototype.reduce()
:Uwaga: Sprawdź zgodność przeglądarki pod kątem
reduce
metody i użyj wypełnienia, jeśli jest to wymagane.źródło
:)
Tak, pomyślałem, że możereduce
być fajną alternatywą.array.reduce((a, e, i) => (e === value) ? a.concat(i) : a, [])
contat
jest wolniejsze niżpush
, dlatego trzymam się odpowiedzi.Inne podejście wykorzystujące Array.prototype.map () i Array.prototype.filter () :
źródło
map(…)
sprawdza w każdej iteracji równośće
ivalue
. Kiedy pasują do indeksu, zwracany jest pusty ciąg. Aby pozbyć się tych fałszywych wartości,filter(String)
upewnij się, że wynik zawiera tylko wartości typu łańcuchowego, a NIE puste.filter(String)
można również zapisać jako:filter(e => e !== '')
String(thing)
wymusza cokolwiek na łańcuchu.Array#filter
zwraca tablicę wszystkich wartości, dla których warunek jest prawdziwy . Ponieważ puste łańcuchy są fałszywe , NIE są one uwzględniane w tablicy.Prostszy sposób w stylu es6.
źródło
Możesz napisać proste, czytelne rozwiązanie, używając obu
map
ifilter
:EDYCJA: Jeśli nie potrzebujesz obsługi IE / Edge (lub transpilujesz swój kod), ES2019 dał nam flatMap , która pozwala to zrobić w prostym , jednowierszowym :
źródło
Uwaga: MDN podaje metodę wykorzystującą pętlę while :
Nie powiedziałbym, że to lepsze niż inne odpowiedzi. Po prostu interesujące.
źródło
Chcę tylko zaktualizować inną prostą metodę.
Możesz także użyć metody forEach.
źródło
źródło
To zadziałało dla mnie:
źródło
Aby udostępnić inną metodę, możesz również użyć generatorów funkcji, aby osiągnąć wynik:
źródło
Możemy użyć Stack i włożyć „i” do stosu za każdym razem, gdy napotkamy warunek „arr [i] == wartość”
Sprawdź to:
źródło
javascript
, podczas gdy twoja odpowiedź jestJava
jak wierzę?źródło
Możesz użyć Polyfill
}
Użyj tego w ten sposób:
źródło
findIndex
pobiera tylko pierwszy indeks, który pasuje do danych wyjściowych wywołania zwrotnego. Możesz zaimplementować własnefindIndexes
, rozszerzając Array, a następnie rzutując tablice na nową strukturę.źródło
Jeśli zamierzasz użyć podkreślenia / lodash, możesz to zrobić
źródło
(["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"]).map((v, i)=> [i, v === "Nano"]).filter(v=>v[1]).map(v=>v[0])