Apa metode terbaik untuk mendapatkan indeks array yang berisi objek?
Bayangkan skenario ini:
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello,qaz);
Sekarang saya ingin memiliki indexOf
objek hello
properti yang 'stevie'
mana, dalam contoh ini, akan 1
.
Saya cukup pemula dengan JavaScript dan saya tidak tahu apakah ada metode sederhana atau apakah saya harus membangun fungsi saya sendiri untuk melakukan itu.
javascript
Antonio Laguna
sumber
sumber
hello
danqaz
?var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor); var objectFound = array[elementPos];
[tautan] ( stackoverflow.com/a/16100446/1937255 )Jawaban:
Saya pikir Anda bisa menyelesaikannya dalam satu baris menggunakan fungsi peta :
sumber
Array.prototype.map()
Array.prototype.findIndex didukung di semua browser selain IE (non-edge). Tapi polyfill yang disediakan bagus.
Solusi dengan peta tidak apa-apa. Tapi Anda mengulangi seluruh array setiap pencarian. Itu hanya kasus terburuk untuk findIndex yang berhenti iterasi setelah kecocokan ditemukan.
Sebenarnya tidak ada cara ringkas(ketika dev harus khawatir tentang IE8) , tapi inilah solusi umum:atau sebagai fungsi:
Hanya beberapa catatan:
Sebagai contoh,
sumber
Di ES2015, ini cukup mudah:
atau, mungkin dengan kinerja yang lebih baik untuk array yang lebih besar:
sumber
sumber
Saya suka jawaban Pablo, tetapi peta Array # indexOf dan Array # tidak berfungsi di semua browser. Garis bawah akan menggunakan kode asli jika tersedia, tetapi memiliki fallback juga. Plus itu memiliki metode pemetik untuk melakukan apa yang dilakukan metode peta anonim Pablo.
sumber
chain
berlebihan di sini._.pluck(myArray, 'hello').indexOf('stevie')
Atau prototipe:
sumber
Array.prototype.indexOfObject = function(property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; };
if (typeof property === 'string' || typeof property === 'number' || typeof property === 'boolean') return oldIndexOf(property, value);
. Ini karena ini adalah beberapa tipe yang tidak berubah. Saya juga akan menampilkan argumen ketiga untuk mengaktifkan fallback ke metode asli jika diperlukan.Singkat
Gunakan Kasus:
API:
sumber
Saya melakukan beberapa pengujian kinerja berbagai jawaban di sini, yang dapat dijalankan sendiri oleh siapa saja:
https://jsperf.com/find-index-of-object-in-array-by-contents
Berdasarkan tes awal saya di Chrome, metode berikut (menggunakan for loop yang diatur di dalam prototipe) adalah yang tercepat:
Kode ini adalah versi yang sedikit dimodifikasi dari jawaban Nathan Zaetta.
Dalam tolok ukur kinerja saya mencobanya dengan target berada di tengah (indeks 500) dan sangat akhir (indeks 999) dari 1000 objek array, dan bahkan jika saya meletakkan target sebagai item terakhir dalam array (artinya bahwa ia harus melalui setiap item dalam array sebelum ditemukan) itu masih berakhir tercepat.
Solusi ini juga memiliki manfaat menjadi salah satu yang paling singkat untuk eksekusi berulang kali, karena hanya baris terakhir yang perlu diulang:
sumber
while
lingkaran, bukanfor
satu, danperformance.now()
. Saya berharap jawaban ini lebih terangkat dan saya melihatnya lebih awal, itu akan menghemat waktu saya ...Saya membandingkan beberapa metode dan menerima hasil dengan cara tercepat untuk menyelesaikan masalah ini. Itu sebuah
for
lingkaran. Ini 5+ kali lebih cepat daripada metode lainnya.Inilah halaman tesnya: https://jsbench.me/9hjewv6a98
sumber
for-of
lingkaran pun?Sementara, sebagian besar jawaban lain di sini valid. Terkadang, yang terbaik adalah membuat fungsi sederhana pendek di dekat tempat Anda akan menggunakannya.
Itu tergantung pada apa yang penting bagi Anda. Mungkin menyimpan baris kode dan sangat pintar untuk menggunakan satu-liner, atau untuk menempatkan solusi generik di suatu tempat yang mencakup berbagai kasus tepi. Tapi kadang-kadang lebih baik mengatakan: "di sini aku melakukannya seperti ini" daripada meninggalkan pengembang masa depan untuk memiliki pekerjaan rekayasa balik ekstra. Terutama jika Anda menganggap diri Anda "seorang pemula" seperti dalam pertanyaan Anda.
sumber
Pikirkan itu
[0]
.Sangat tepat untuk digunakan
reduce
sebagaiAntonio Laguna
jawaban.Permintaan maaf untuk singkatnya ...
sumber
Jika objek Anda adalah objek yang sama dengan yang Anda gunakan dalam array, Anda harus bisa mendapatkan indeks Obyek dengan cara yang sama seperti jika Anda menggunakan string.
sumber
Coba ini:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
sumber
sederhana:
sumber
Jika Anda hanya tertarik untuk menemukan posisi tersebut, lihat jawaban @ Pablo .
pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
Namun, jika Anda ingin menemukan elemen (yaitu jika Anda berpikir untuk melakukan sesuatu seperti ini
myArray[pos]
), ada cara satu-line yang lebih efisien untuk melakukannya, menggunakanfilter
.element = myArray.filter((e) => e.hello === 'stevie')[0];
Lihat hasil kinerja (~ + 42% ops / dtk): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3
sumber
Lihat contoh ini: http://jsfiddle.net/89C54/
Mulai menghitung dengan nol.
sumber
Saya telah membuat fungsi generik untuk memeriksa di bawah ini adalah kode & berfungsi untuk objek apa pun
Lansiran pertama akan mengembalikan -1 (berarti kecocokan tidak ditemukan) & lansiran kedua akan mengembalikan 0 (berarti kecocokan ditemukan).
sumber
Gunakan
_.findIndex
dari perpustakaan underscore.jsInilah contohnya
_.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1
sumber
Menggunakan
findIndex
metode ES6 , tanpa lodash atau perpustakaan lain, Anda dapat menulis:Ini akan membandingkan properti langsung objek, tetapi tidak berulang ke properti.
Jika implementasi Anda belum menyediakan
findIndex
(kebanyakan tidak), Anda dapat menambahkan polyfill ringan yang mendukung pencarian ini:(dari jawaban saya pada penipuan ini )
sumber
Anda dapat menggunakan fungsi asli dan nyaman
Array.prototype.findIndex()
pada dasarnya:Hanya catatan itu tidak didukung di Internet Explorer, Opera dan Safari, tetapi Anda dapat menggunakan Polyfill yang disediakan di tautan di bawah ini.
Informasi lebih lanjut:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex
sumber
Lebih jauh dari jawaban @Monika Garg , Anda dapat menggunakan
findIndex()
(Ada polyfill untuk peramban yang tidak didukung).Saya melihat bahwa orang menolak jawaban ini, dan saya berharap mereka melakukan ini karena sintaks yang salah, karena menurut pendapat saya, ini adalah cara yang paling elegan.
Sebagai contoh:
sumber
Ini adalah cara untuk menemukan indeks objek dalam array
sumber
Ini berfungsi tanpa kode khusus
sumber
Anda cukup menggunakan
Tidak ada garis bawah, tidak untuk, hanya pengurangan.
sumber
sumber
Anda dapat membuat prototipe Anda sendiri untuk melakukan ini:
sesuatu seperti:
sumber
Saya lebih suka menggunakan
findIndex()
metode:index
akan memberi Anda nomor indeks.sumber