Saya memiliki array target ["apple","banana","orange"]
, dan saya ingin memeriksa apakah array lain mengandung salah satu elemen array target.
Sebagai contoh:
["apple","grape"] //returns true;
["apple","banana","pineapple"] //returns true;
["grape", "pineapple"] //returns false;
Bagaimana saya bisa melakukannya dalam JavaScript?
javascript
arrays
Alex
sumber
sumber
for
loop dan beralih di atas array target. Jika setiap elemen terkandung dalam array saat ini (gunakancurrent.indexOf(elem) !== -1)
, maka semuanya ada di sana.Jawaban:
Vanilla JS
ES2016:
ES6:
Bagaimana itu bekerja
some(..)
memeriksa setiap elemen array terhadap fungsi tes dan mengembalikan true jika ada elemen array melewati fungsi tes, jika tidak, ia mengembalikan false.indexOf(..) >= 0
danincludes(..)
keduanya mengembalikan true jika argumen yang diberikan hadir dalam array.sumber
true
jika ada elemen array melewati fungsi tes. Kalau tidak, ia kembalifalse
.[false, false, false]
bukan array kosong[]
?vanilla js
sumber
some()
adalah rad. Berhenti sesegera sesuatu cocok.arr.some(v=> haystack.indexOf(v) >= 0)
arr.some(v => haystack.includes(v))
arr1.some(v => arr2.indexOf(v) >= 0)
.includes
, karena tampaknya itu tidak didukung di IE: stackoverflow.com/questions/36574351/…Jika Anda tidak menentang menggunakan libray, http://underscorejs.org/ memiliki metode persimpangan, yang dapat menyederhanakan ini:
Fungsi persimpangan akan mengembalikan array baru dengan item yang cocok dan jika tidak cocok itu mengembalikan array kosong.
sumber
ES6 (tercepat)
ES2016
Menggarisbawahi
DEMO: https://jsfiddle.net/r257wuv5/
jsPerf: https://jsperf.com/array-contains-any-element-of-another-array
sumber
Jika Anda tidak perlu mengetikkan paksaan (karena penggunaan
indexOf
), Anda dapat mencoba sesuatu seperti berikut:Di mana
arr
berisi item target. Pada akhirnya,found
akan muncul apakah array kedua memiliki paling tidak satu pertandingan melawan target.Tentu saja, Anda dapat menukar nomor dengan apa pun yang ingin Anda gunakan - string baik-baik saja, seperti contoh Anda.
Dan dalam contoh spesifik saya, hasilnya seharusnya
true
karena array kedua3
ada di target.MEMPERBARUI:
Inilah cara saya mengaturnya menjadi suatu fungsi (dengan beberapa perubahan kecil dari sebelumnya):
DEMO: http://jsfiddle.net/u8Bzt/
Dalam hal ini, fungsi tersebut dapat dimodifikasi untuk
targetArray
diteruskan sebagai argumen alih-alih hardcoded dalam penutupan.UPDATE2:
Sementara solusi saya di atas mungkin berhasil dan (mudah-mudahan lebih) dapat dibaca, saya percaya cara "lebih baik" untuk menangani konsep yang saya jelaskan adalah melakukan sesuatu yang sedikit berbeda. "Masalah" dengan solusi di atas adalah bahwa di
indexOf
dalam loop menyebabkan array target di-loop sepenuhnya untuk setiap item dalam array lain. Ini dapat dengan mudah "diperbaiki" dengan menggunakan "pencarian" (peta ... objek JavaScript literal). Ini memungkinkan dua loop sederhana, di atas setiap array. Ini sebuah contoh:DEMO: http://jsfiddle.net/5Lv9v/
Kelemahan dari solusi ini adalah hanya angka dan string (dan boolean) yang dapat digunakan (dengan benar), karena nilainya (secara implisit) dikonversi menjadi string dan ditetapkan sebagai kunci untuk peta pencarian. Ini tidak sepenuhnya baik / mungkin / mudah dilakukan untuk nilai-nilai non-literal.
sumber
undefined
... itu untuk apa!!
" - itu salah. Ini akan mengembalikan oposisi boolean!
.Solusi ES6:
Berbeda dengan itu: Harus mengandung semua nilai.
Semoga bermanfaat.
sumber
Anda bisa menggunakan lodash dan melakukan:
Set intersection dilakukan pada kedua koleksi yang menghasilkan array elemen identik.
sumber
intersection
akan terus membandingkan bahkan setelah menemukan pertandingan pertama untuk menemukan semuanya. Ini seperti menggunakanfilter
saat Anda membutuhkannya sajafind
.Menggunakan filter / indexOf :
sumber
Atau Anda bahkan dapat memiliki kinerja yang lebih baik jika Anda pertama kali mengetahui yang mana dari dua array ini yang lebih panjang dan menghasilkan
Set
array yang paling panjang, sambil menerapkansome
metode pada yang paling pendek:sumber
indexOf
danincludes
, Anda adalah orang pertama yang menjawab dengan solusi berbasis set yang lebih efisien, menggunakan yang asliSet
, 4 tahun setelah diperkenalkan ke EcmaScript. +1Saya menemukan sintaks pendek dan manis ini untuk mencocokkan semua atau beberapa elemen antara dua array. Sebagai contoh
// ATAU operasi. temukan apakah ada elemen array2 yang ada di array1. Ini akan kembali segera setelah ada kecocokan pertama karena beberapa metode rusak ketika fungsi mengembalikan TRUE
// cetak BENAR
// DAN operasi. temukan apakah semua elemen array2 ada di array1. Ini akan kembali segera setelah tidak ada kecocokan pertama karena beberapa metode rusak ketika fungsi mengembalikan TRUE
// mencetak FALSE
Semoga itu bisa membantu seseorang di masa depan!
sumber
Anda dapat menggunakan panggilan Array.prototype.some bersarang. Ini memiliki keuntungan yang akan ditebusnya pada pertandingan pertama alih-alih solusi lain yang akan berjalan melalui loop bersarang penuh.
misalnya.
sumber
Ini adalah kasus menarik yang saya pikir harus saya bagikan.
Katakanlah Anda memiliki larik objek dan larik filter yang dipilih.
Untuk menerapkan filter yang dipilih ke struktur ini kami dapat
sumber
Saya menulis 3 solusi. Pada dasarnya mereka melakukan hal yang sama. Mereka mengembalikan true begitu mereka mendapatkannya
true
. Saya menulis 3 solusi hanya untuk menunjukkan 3 cara berbeda untuk melakukan sesuatu. Sekarang, itu tergantung apa yang Anda sukai. Anda dapat menggunakan performance.now () untuk memeriksa kinerja dari satu solusi atau yang lain. Dalam solusi saya, saya juga memeriksa array mana yang terbesar dan mana yang terkecil untuk membuat operasi lebih efisien.Solusi ke-3 mungkin bukan yang paling lucu tetapi efisien. Saya memutuskan untuk menambahkannya karena dalam beberapa wawancara pengkodean Anda tidak diperbolehkan menggunakan metode bawaan.
Terakhir, tentu saja ... kita dapat menemukan solusi dengan 2 NESTED untuk loop (cara brute force) tetapi Anda ingin menghindarinya karena kompleksitas waktu yang buruk O (n ^ 2) .
catatan:
indexOf () vs meliputi ()
Mana yang memiliki kinerja lebih baik ?
indexOf()
untuk sedikit, tetapi termasuk lebih mudah menurut pendapat saya.Jika saya tidak salah
.includes()
danindexOf()
menggunakan loop di belakang layar, maka Anda akan berada di O (n ^ 2) saat menggunakannya.some()
.MENGGUNAKAN loop
MENGGUNAKAN .some ()
MENGGUNAKAN PETA Kompleksitas waktu O (2n) => O (n)
Kode di: stackblitz saya
Saya bukan ahli dalam kinerja atau BigO jadi jika sesuatu yang saya katakan salah beri tahu saya.
sumber
Bagaimana dengan menggunakan kombinasi some / findIndex dan indexOf?
Jadi sesuatu seperti ini:
Agar lebih mudah dibaca, Anda dapat menambahkan fungsionalitas ini ke objek Array itu sendiri.
Catatan: Jika Anda ingin melakukan sesuatu dengan predikat, Anda bisa mengganti indeks bagian dalam. Dari dengan findIndex lain dan predikat
sumber
Solusi saya berlaku Array.prototype.some () dan Array.prototype.includes () array helpers yang melakukan pekerjaan mereka dengan cukup efisien juga
ES6
sumber
Hanya satu solusi lagi
Periksa apakah a1 berisi semua elemen a2
sumber
Ini dapat dilakukan dengan hanya mengulangi seluruh array utama dan memeriksa apakah array lain mengandung elemen target atau tidak.
Coba ini:
DEMO di JSFIDDLE
sumber
Dengan underscorejs
sumber
indexOf
Saya pikir sebaliknya :). Di sisi lain saya setuju untuk mencoba tidak menambahkan perpustakaan eksternal jika mereka tidak benar-benar diperlukan, tapi saya tidak benar-benar obsesif dengan itu, perpustakaan bagian ketiga tidak hanya menawarkan fungsionalitas yang berguna tetapi juga fungsionalitas yang solid . Misalnya: apakah Anda sudah menguji semua case tepi dan browser mayor dengan solusi Anda? ... (omong-omong,every
bukan mencoba menemukan indeks dalam daftar tetapi mengevaluasi sesuatu di setiap elemen dalam daftar)Menambahkan ke Array Prototype
Penafian: Banyak yang akan sangat menyarankan hal ini. Satu-satunya waktu itu benar-benar akan menjadi masalah adalah jika perpustakaan menambahkan fungsi prototipe dengan nama yang sama (yang berperilaku berbeda) atau sesuatu seperti itu.
Kode:
Tanpa menggunakan fungsi panah besar:
Pemakaian
sumber
Vanilla JS dengan pencocokan sebagian & tidak sensitif huruf
Masalah dengan beberapa pendekatan sebelumnya adalah bahwa mereka membutuhkan kecocokan yang tepat dari setiap kata . Tetapi, Bagaimana jika Anda ingin memberikan hasil untuk kecocokan parsial?
Ini berguna ketika Anda ingin memberikan kotak pencarian tempat pengguna mengetik kata-kata dan hasilnya dapat memiliki kata-kata itu dalam urutan, posisi, dan huruf besar-kecil.
sumber
Perbarui @Paul Grimshaw, gunakan
includes
insteed ofindexOf
untuk lebih mudah dibacasumber
Saya datang dengan solusi di simpul menggunakan garis bawah js seperti ini:
sumber
Secara pribadi, saya akan menggunakan fungsi berikut:
Metode "toString ()" akan selalu menggunakan koma untuk memisahkan nilai. Hanya akan benar-benar bekerja dengan tipe primitif.
sumber
Array .filter () dengan panggilan bersarang ke .find () akan mengembalikan semua elemen dalam array pertama yang merupakan anggota array kedua. Periksa panjang array yang dikembalikan untuk menentukan apakah ada array kedua di array pertama.
sumber
sumber
sumber