Dua arah indexOf
/ lastIndexOf
alternatif semoga lebih cepat
2015
Meskipun metode baru termasuk sangat bagus, dukungan pada dasarnya nol untuk saat ini.
Sudah lama saya memikirkan cara untuk mengganti fungsi indexOf / lastIndexOf yang lambat.
Cara performan telah ditemukan, dengan melihat jawaban teratas. Dari yang saya pilih contains
fungsi diposting oleh @Damir Zekic yang seharusnya menjadi yang tercepat. Tapi itu juga menyatakan bahwa tolok ukur berasal dari 2008 dan sudah usang.
Saya juga lebih suka while
lebih for
, tetapi karena tidak alasan tertentu saya berakhir menulis fungsi dengan untuk loop. Bisa juga dilakukan dengan awhile --
.
Saya ingin tahu apakah iterasi jauh lebih lambat jika saya memeriksa kedua sisi array saat melakukannya. Tampaknya tidak, dan fungsi ini sekitar dua kali lebih cepat daripada yang terpilih. Jelas itu juga lebih cepat daripada yang asli. Ini di lingkungan dunia nyata, di mana Anda tidak pernah tahu apakah nilai yang Anda cari ada di awal atau di akhir array.
Ketika Anda tahu Anda baru saja mendorong array dengan sebuah nilai, menggunakan lastIndexOf mungkin merupakan solusi terbaik, tetapi jika Anda harus melakukan perjalanan melalui array besar dan hasilnya bisa di mana-mana, ini bisa menjadi solusi yang solid untuk membuat segalanya lebih cepat.
Bidirectional indexOf / lastIndexOf
function bidirectionalIndexOf(a, b, c, d, e){
for(c=a.length,d=c*1; c--; ){
if(a[c]==b) return c; //or this[c]===b
if(a[e=d-1-c]==b) return e; //or a[e=d-1-c]===b
}
return -1
}
//Usage
bidirectionalIndexOf(array,'value');
Uji kinerja
http://jsperf.com/bidirectionalindexof
Sebagai tes saya membuat array dengan entri 100 ribu.
Tiga pertanyaan: di awal, di tengah & di akhir array.
Saya harap Anda juga menemukan ini menarik dan menguji kinerjanya.
Catatan: Seperti yang Anda lihat saya sedikit memodifikasi contains
fungsi untuk mencerminkan indexOf & lastIndexOf output (jadi pada dasarnya true
dengan index
dan false
dengan -1
). Itu seharusnya tidak merusaknya.
Varian prototipe array
Object.defineProperty(Array.prototype,'bidirectionalIndexOf',{value:function(b,c,d,e){
for(c=this.length,d=c*1; c--; ){
if(this[c]==b) return c; //or this[c]===b
if(this[e=d-1-c] == b) return e; //or this[e=d-1-c]===b
}
return -1
},writable:false, enumerable:false});
// Usage
array.bidirectionalIndexOf('value');
Fungsi ini juga dapat dengan mudah dimodifikasi untuk mengembalikan true atau false atau bahkan objek, string atau apa pun itu.
Dan inilah while
variannya:
function bidirectionalIndexOf(a, b, c, d){
c=a.length; d=c-1;
while(c--){
if(b===a[c]) return c;
if(b===a[d-c]) return d-c;
}
return c
}
// Usage
bidirectionalIndexOf(array,'value');
Bagaimana ini mungkin?
Saya pikir perhitungan sederhana untuk mendapatkan indeks yang direfleksikan dalam array sangat sederhana sehingga dua kali lebih cepat daripada melakukan iterasi loop yang sebenarnya.
Berikut ini adalah contoh kompleks yang melakukan tiga pemeriksaan per iterasi, tetapi ini hanya mungkin dilakukan dengan perhitungan yang lebih lama yang menyebabkan pelambatan kode.
http://jsperf.com/bidirectionalindexof/2