Saya memiliki array seperti ini:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
Bagaimana saya bisa mendapatkan indeks objek yang cocok dengan suatu kondisi, tanpa mengulangi seluruh array?
Misalnya, mengingat prop2=="yutu"
, saya ingin mendapatkan indeks 1
.
Saya melihat .indexOf()
tetapi berpikir itu digunakan untuk array sederhana seperti ["a1","a2",...]
. Saya juga memeriksa $.grep()
tetapi ini mengembalikan objek, bukan indeks.
sumber
0
?). Kedua solusi melakukan lebih iterasi dari yang dibutuhkan, yang kurang dari ideal jika array besar (meskipun kemungkinan itu menjadi manusia begitu besar akan melihat yang rendah, kecuali pencarian yang terjadi a lot ).x => x.prop2=="yutu"
kerjanya dengan findIndex ()?function(x) { return x.prop2=="yutu" }
index = a.findIndex(function (x) { return x.prop2 == "yutu" })
memperbaiki masalah sehingga dengan kode polyfill, findIndex bekerja di IE11Anda tidak bisa, sesuatu harus diulang melalui array (setidaknya sekali).
Jika kondisinya banyak berubah, maka Anda harus mengulang dan melihat objek di dalamnya untuk melihat apakah mereka cocok dengan kondisinya. Namun, pada sistem dengan fitur ES5 (atau jika Anda menginstal shim), iterasi dapat dilakukan dengan cukup ringkas:
Itu menggunakan (ish) baru
Array#some
fungsi , yang loop melalui entri dalam array sampai fungsi yang memberikan mengembalikan nilai true. Fungsi yang saya berikan ini menyimpan indeks entri yang cocok, lalu kembalitrue
untuk menghentikan iterasi.Atau tentu saja, gunakan a
for
lingkaran. Berbagai opsi iterasi Anda tercakup dalam jawaban lain ini .Tetapi jika Anda akan selalu menggunakan properti yang sama untuk pencarian ini, dan jika nilai properti unik, Anda dapat mengulangi sekali saja dan membuat objek untuk memetakannya:
(Atau, sekali lagi, Anda bisa menggunakan
for
loop atau salah satunya opsi lain .)Maka jika Anda perlu menemukan entri
prop2 = "yutu"
, Anda dapat melakukan ini:Saya menyebutnya "lintas-pengindeksan" array. Secara alami, jika Anda menghapus atau menambah entri (atau mengubah
prop2
nilainya), Anda perlu memperbarui objek pemetaan Anda juga.sumber
thg435
melakukan apa yang saya inginkan ...Apa yang dikatakan TJ Crowder, semua akan memiliki semacam iterasi tersembunyi, dengan lodash ini menjadi:
sumber
Dan untuk nomor array dasar Anda juga dapat melakukan ini:
Anda akan mendapatkan -1 jika tidak dapat menemukan nilai dalam array.
sumber
Iterate atas semua elemen array. Ini mengembalikan indeks dan benar atau salah jika kondisinya tidak cocok.
Penting adalah nilai pengembalian eksplisit true (atau nilai yang hasilnya boolean benar). Penugasan tunggal tidak memadai, karena kemungkinan indeks dengan 0 (Boolean (0) === false), yang tidak akan menghasilkan kesalahan tetapi menonaktifkan jeda iterasi.
Edit
Versi yang lebih pendek dari yang di atas:
sumber
|
operator, itu adalah versi pendek untuk mendapatkan dari indeks (dengan -1) a truthy / falsy hasil, jika indeks ada.~
itu tidak berfungsi seperti itu.!!(index = 0)
dan!!~(index = 0)
memang perbedaan. Terima kasih!Anda dapat menggunakan Array.prototype.some () dengan cara berikut (sebagaimana disebutkan dalam jawaban lain):
https://jsfiddle.net/h1d69exj/2/
sumber
Saya telah melihat banyak solusi di atas.
Di sini saya menggunakan fungsi peta untuk menemukan indeks teks pencarian di objek array.
Saya akan menjelaskan jawaban saya dengan menggunakan data siswa.
langkah 1 : buat objek array untuk siswa (opsional Anda dapat membuat objek array Anda sendiri).
var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];
langkah 2 : Buat variabel untuk mencari teks
var studentNameToSearch = "Divya";
langkah 3 : Buat variabel untuk menyimpan indeks yang cocok (di sini kami menggunakan fungsi peta untuk beralih).
var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);
sumber
sumber
Mengapa Anda tidak ingin mengulanginya dengan tepat? Array.prototype.forEach baru sangat bagus untuk tujuan ini!
Anda dapat menggunakan Pohon Pencarian Biner untuk menemukan melalui panggilan metode tunggal jika Anda mau. Ini adalah implementasi rapi dari pohon Pencarian BTree dan Red black di JS - https://github.com/vadimg/js_bintrees - tapi saya tidak yakin apakah Anda dapat menemukan indeks pada saat yang sama.
sumber
Satu langkah menggunakan Array.reduce () - tanpa jQuery
akan kembali
null
jika indeks tidak ditemukan.sumber
sumber
Georg telah menyebutkan ES6 memiliki Array.findIndex untuk ini. Dan beberapa jawaban lain adalah solusi untuk ES5 menggunakan metode Array.some.
Satu lagi pendekatan elegan bisa dilakukan
Pada saat yang sama saya ingin menekankan, Array.some dapat diimplementasikan dengan teknik pencarian biner atau efisien lainnya. Jadi, ini mungkin berperforma lebih baik untuk loop di beberapa browser.
sumber
Coba kode ini
sumber