Saya bertanya-tanya apakah ada cara yang dikenal, bawaan / elegan untuk menemukan elemen pertama dari array JS yang cocok dengan kondisi tertentu. Setara dengan AC # adalah List.Find .
Sejauh ini saya telah menggunakan kombo dua fungsi seperti ini:
// Returns the first element of an array that satisfies given predicate
Array.prototype.findFirst = function (predicateCallback) {
if (typeof predicateCallback !== 'function') {
return undefined;
}
for (var i = 0; i < arr.length; i++) {
if (i in this && predicateCallback(this[i])) return this[i];
}
return undefined;
};
// Check if element is not undefined && not null
isNotNullNorUndefined = function (o) {
return (typeof (o) !== 'undefined' && o !== null);
};
Dan kemudian saya bisa menggunakan:
var result = someArray.findFirst(isNotNullNorUndefined);
Tetapi karena ada begitu banyak metode array gaya fungsional dalam ECMAScript , mungkin sudah ada sesuatu di luar sana seperti ini? Saya membayangkan banyak orang harus menerapkan hal-hal seperti ini setiap saat ...
javascript
arrays
Jakub P.
sumber
sumber
return (typeof (o) !== 'undefined' && o !== null);
turun ke inireturn o != null;
. Mereka persis setara.Jawaban:
Karena ES6 ada
find
metode asli untuk array; ini berhenti menghitung array setelah menemukan kecocokan pertama dan mengembalikan nilai.Jawaban lama:
Saya harus mengirim jawaban untuk menghentikan
filter
saran ini :-)Anda dapat menggunakan
some
metode Array untuk mengulangi array sampai suatu kondisi terpenuhi (dan kemudian berhenti). Sayangnya itu hanya akan mengembalikan apakah kondisi dipenuhi sekali, bukan oleh elemen mana (atau pada indeks apa) itu dipenuhi. Jadi kita harus sedikit mengubahnya:sumber
some()
di sisi lain, segera kembali, yang jauh lebih cepat di hampir semua kasus daripada solusi penyaringan.Pada ECMAScript 6, Anda dapat menggunakannya
Array.prototype.find
untuk ini. Ini diimplementasikan dan bekerja di Firefox (25.0), Chrome (45.0), Edge (12), dan Safari (7.1), tetapi tidak di Internet Explorer atau sekelompok platform lama atau tidak umum lainnya .Misalnya, ekspresi di bawah ini dievaluasi menjadi
106
.Jika Anda ingin menggunakan ini sekarang tetapi membutuhkan dukungan untuk IE atau browser yang tidak didukung lainnya, Anda dapat menggunakan shim. Saya merekomendasikan es6-shim . MDN juga menawarkan shim jika karena alasan tertentu Anda tidak ingin memasukkan seluruh es6-shim ke dalam proyek Anda. Untuk kompatibilitas maksimum, Anda menginginkan es6-shim, karena tidak seperti versi MDN, ia mendeteksi implementasi asli buggy dari
find
dan menimpa mereka (lihat komentar yang dimulai "Kerjakan bug di Array # find dan Array # findIndex" dan baris yang segera mengikutinya) .sumber
find
lebih baik darifilter
sejakfind
berhenti segera ketika menemukan elemen cocok kondisi, sementarafilter
loop melalui semua elemen untuk memberikan semua elemen cocok.Bagaimana dengan menggunakan filter dan mendapatkan indeks pertama dari array yang dihasilkan?
sumber
.shift
di sini?shift
adalah "terlihat pintar" tetapi sebenarnya lebih membingungkan. Siapa yang akan berpikir bahwa meneleponshift()
tanpa argumen sama dengan mengambil elemen pertama? Tidak jelas IMO. Akses array lebih cepat: jsperf.com/array-access-vs-shift.shift()
atas[0]
secara eksplisit dinyatakan seperti ini. Meskipun begitu, ini adalah alternatif yang bisa Anda pilih untuk digunakan atau tidak, saya tetap menggunakannya[0]
.Seharusnya jelas sekarang bahwa JavaScript tidak menawarkan solusi semacam itu secara asli; di sini adalah dua turunan terdekat, yang paling bermanfaat pertama:
Array.prototype.some(fn)
menawarkan perilaku berhenti yang diinginkan ketika suatu kondisi terpenuhi, tetapi hanya mengembalikan apakah ada elemen; tidak sulit untuk menerapkan beberapa tipu daya, seperti solusi yang ditawarkan oleh jawaban Bergi .Array.prototype.filter(fn)[0]
membuat one-liner yang hebat tetapi paling tidak efisien, karena Anda membuangN - 1
elemen hanya untuk mendapatkan yang Anda butuhkan.Metode pencarian tradisional dalam JavaScript ditandai dengan mengembalikan indeks elemen yang ditemukan alih-alih elemen itu sendiri atau -1. Ini menghindari harus memilih nilai kembali dari domain semua jenis yang mungkin; indeks hanya bisa berupa angka dan nilai negatif tidak valid.
Kedua solusi di atas tidak mendukung pencarian offset, jadi saya memutuskan untuk menulis ini:
sumber
Ringkasan:
ES6
find()
find()
terletak diArray.prototype
sehingga dapat digunakan pada setiap array.find()
mengambil panggilan balik di mana suatuboolean
kondisi diuji. Fungsi mengembalikan nilai (bukan indeks!)Contoh:
sumber
Jika Anda menggunakan,
underscore.js
Anda dapat menggunakanfind
danindexOf
fungsinya untuk mendapatkan apa yang Anda inginkan:Dokumentasi:
sumber
Pada ES 2015,
Array.prototype.find()
menyediakan fungsionalitas yang tepat ini.Untuk browser yang tidak mendukung fitur ini, Mozilla Developer Network telah menyediakan polyfill (disisipkan di bawah):
sumber
Array.prototype.find () melakukan hal itu, info lebih lanjut: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
sumber
sumber
Saya mendapatkan inspirasi dari berbagai sumber di internet untuk mendapatkan solusi di bawah ini. Ingin memperhitungkan beberapa nilai default dan menyediakan cara untuk membandingkan setiap entri untuk pendekatan umum yang dipecahkan ini.
Penggunaan: (memberi nilai "Kedua")
Penerapan:
sumber
Tidak ada fungsi bawaan di Javascript untuk melakukan pencarian ini.
Jika Anda menggunakan jQuery, Anda dapat melakukan a
jQuery.inArray(element,array)
.sumber
$.inArray
tidak mengembalikan boolean, itu (mengejutkan!) Mengembalikan indeks elemen pencocokan pertama. Namun, masih tidak melakukan apa yang diminta OP.Cara yang kurang elegan yaitu
throw
pesan kesalahan yang benar (berdasarkanArray.prototype.filter
) tetapi akan berhenti diulang pada hasil pertamaMaka contohnya adalah
Ini bekerja dengan mengakhiri
filter
dengan menggunakanthrow
.sumber