The .indexOf()
metode memiliki parameter opsional kedua yang menentukan indeks untuk memulai pencarian dari, sehingga Anda dapat menyebutnya dalam satu lingkaran untuk menemukan semua contoh nilai tertentu:
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");
Anda tidak benar-benar memperjelas bagaimana Anda ingin menggunakan indeks, jadi fungsi saya mengembalikannya sebagai array (atau mengembalikan array kosong jika nilainya tidak ditemukan), tetapi Anda dapat melakukan sesuatu yang lain dengan nilai indeks individual di dalam lingkaran.
PEMBARUAN: Sesuai komentar VisioN, perulangan for yang sederhana akan menyelesaikan pekerjaan yang sama dengan lebih efisien, dan lebih mudah untuk dipahami dan karena itu lebih mudah untuk dipelihara:
function getAllIndexes(arr, val) {
var indexes = [], i;
for(i = 0; i < arr.length; i++)
if (arr[i] === val)
indexes.push(i);
return indexes;
}
for
loop dengan array indeks yang terisi..indexOf()
saya ingin menunjukkan bahwa itu dapat melakukan pekerjaan itu. (Saya kira saya pikir OP bisa mengetahui bagaimana melakukannya dengan for loop.) Tentu saja ada cara lain untuk melakukannya, misalnya,Cars.reduce(function(a, v, i) { if (v==="Nano") a.push(i); return a; }, []);
indexes
bukannyaindices
: PSolusi alternatif lain adalah dengan menggunakan
Array.prototype.reduce()
:NB: Periksa kompatibilitas browser untuk
reduce
metode dan gunakan polyfill jika diperlukan.sumber
:)
Ya, saya pikir mungkinreduce
bisa menjadi alternatif yang bagus.array.reduce((a, e, i) => (e === value) ? a.concat(i) : a, [])
contat
lebih lambat daripush
, oleh karena itu saya tetap dengan jawabannya.Pendekatan lain menggunakan Array.prototype.map () dan Array.prototype.filter () :
sumber
map(…)
memeriksa setiap iterasi untuk persamaane
danvalue
. Ketika mereka cocok, indeks dikembalikan, jika tidak, string kosong. Untuk menghilangkan nilai falsy tersebut,filter(String)
pastikan bahwa hasil hanya berisi nilai yang bertipe string dan BUKAN kosong.filter(String)
dapat juga ditulis sebagai:filter(e => e !== '')
String(thing)
memaksa apapun menjadi sebuah string.Array#filter
mengembalikan sebuah array dari semua nilai-nilai yang kondisinya truthy . Karena string kosong adalah falsy , mereka TIDAK termasuk dalam array.Cara yang lebih sederhana dengan gaya es6.
sumber
Anda dapat menulis solusi sederhana yang dapat dibaca untuk ini dengan menggunakan
map
danfilter
:EDIT: Jika Anda tidak perlu mendukung IE / Edge (atau mentransformasikan kode Anda), ES2019 memberi kami flatMap , yang memungkinkan Anda melakukan ini dalam satu baris sederhana:
sumber
Catatan: MDN memberikan metode menggunakan while loop :
Saya tidak akan mengatakan itu lebih baik dari jawaban lain. Menarik saja.
sumber
Saya hanya ingin memperbarui dengan metode lain yang mudah.
Anda juga dapat menggunakan metode forEach.
sumber
sumber
Ini berhasil untuk saya:
sumber
Hanya untuk membagikan metode lain, Anda dapat menggunakan Generator Fungsi untuk mendapatkan hasilnya juga:
sumber
Kita bisa menggunakan Stack dan mendorong "i" ke dalam stack setiap kali kita menemukan kondisi "arr [i] == value"
Periksa ini:
sumber
javascript
, sedangkan jawaban Anda adalahJava
saya percaya?sumber
Anda dapat menggunakan Polyfill
}
Gunakan seperti ini:
sumber
findIndex
hanya mengambil indeks pertama yang cocok dengan keluaran callback. Anda dapat menerapkannya sendirifindIndexes
dengan memperluas Array, lalu mentransmisikan array Anda ke struktur baru.sumber
Jika Anda berniat menggunakan garis bawah / lodash, Anda bisa melakukannya
sumber
(["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"]).map((v, i)=> [i, v === "Nano"]).filter(v=>v[1]).map(v=>v[0])