Jika Anda ingin tetap menggunakan garis bawah agar fungsi predikat Anda bisa lebih fleksibel, berikut 2 ide.
Metode 1
Karena predikat untuk _.findmenerima nilai dan indeks elemen, Anda dapat menggunakan efek samping untuk mengambil indeks, seperti ini:
var idx;
_.find(tv, function(voteItem, voteIdx){
if(voteItem.id == voteID){ idx = voteIdx; return true;};
});
Metode 2
Melihat sumber garis bawah, inilah cara _.findimplementasinya:
_.find = _.detect = function(obj, predicate, context) {
var result;
any(obj, function(value, index, list) {
if (predicate.call(context, value, index, list)) {
result = value;
return true;
}
});
return result;
};
Untuk membuat ini menjadi findIndexfungsi, cukup ganti baris result = value;dengan result = index;Ini ide yang sama seperti metode pertama. Saya menyertakannya untuk menunjukkan bahwa garis bawah juga menggunakan efek samping untuk diterapkan _.find.