Saya ingin memahami cara terbaik untuk memfilter array dari semua elemen yang lain . Saya mencoba dengan fungsi filter, tetapi tidak sampai pada saya bagaimana memberikannya nilai yang ingin saya hapus.
Sesuatu seperti:
var array = [1,2,3,4];
var anotherOne = [2,4];
var filteredArray = array.filter(myCallback);
// filteredArray should now be [1,3]
function myCallBack(){
return element ! filteredArray;
//which clearly can't work since we don't have the reference <,<
}
jika fungsi filter tidak berguna, bagaimana Anda menerapkan ini?
Sunting: saya memeriksa kemungkinan pertanyaan rangkap, dan itu bisa bermanfaat bagi mereka yang mengerti javascript dengan mudah. Jawabannya diperiksa dengan baik membuat semuanya menjadi mudah.
javascript
arrays
filter
Koop4
sumber
sumber
return arrTwo.indexOf(e) === -1;
Kode:var filteredArr = firstArr.filter(el => secondArr.indexOf(el) === -1);
Jawaban:
Anda dapat menggunakan
this
parameterfilter()
fungsi untuk menghindari menyimpan array filter Anda dalam variabel global.sumber
this
.this
sepertinya selalu tidak terdefinisi ?! AnehSaya akan lakukan sebagai berikut;
sumber
const filteredResults = this.state.cards.filter( result => !this.state.filterOut.includes(result.category) )
mana this.state.cards dalam array objek dan this.state.filterOut adalah array nilai yang sesuai dengan kunci 'kategori' pada objek yang Saya ingin menghapus.Dalam panggilan balik, Anda memeriksa apakah setiap nilai
array
dalamanotherOne
https://jsfiddle.net/0tsyc1sx/
Jika Anda menggunakan
lodash.js
, gunakan_.difference
Demo
Jika Anda memiliki array objek:
Demo array benda
Demo berbagai objek dengan lodash
sumber
id
dalamanotherOne_el.id == array_el.id
dengan apa pun kunci yang Anda miliki di objek Anda sendiri. Anda harus mendapatkan pengetahuan tentang array dan objek dalam javascript, ini akan membantu Anda memahami lebih baik jawabannyasumber
Kode di bawah ini adalah cara paling sederhana untuk memfilter array sehubungan dengan array lain. Kedua array dapat memiliki objek di dalamnya, bukan nilai.
Keluaran:
[3, 6]
sumber
Ada banyak jawaban untuk pertanyaan Anda, tetapi saya tidak melihat siapa pun yang menggunakan ekspresi lambda:
sumber
Semua solusi di atas "berfungsi", tetapi kurang optimal untuk kinerja dan semuanya mendekati masalah dengan cara yang sama yang secara linear mencari semua entri pada setiap titik menggunakan Array.prototype.indexOf atau Array.prototype.includes . Solusi yang jauh lebih cepat (jauh lebih cepat daripada pencarian biner untuk kebanyakan kasus) adalah dengan mengurutkan array dan melompat ke depan saat Anda melanjutkan seperti yang terlihat di bawah ini. Namun, satu kelemahannya adalah ini mengharuskan semua entri dalam array menjadi angka atau string. Namun, pencarian biner dalam beberapa kasus yang jarang terjadi mungkin lebih cepat daripada pencarian linear progresif. Kasus-kasus ini muncul dari fakta bahwa pencarian linear progresif saya memiliki kompleksitas O (2n 1 + n 2 ) (hanya O (n 1+ n 2 ) dalam versi C / C ++ yang lebih cepat) (di mana n 1 adalah array yang dicari dan n 2 adalah array filter), sedangkan pencarian biner memiliki kompleksitas O (n 1 ceil (log 2 n 2 )) ( ceil = round up - to ceil ing), dan, terakhir, pencarian indexOf memiliki kompleksitas yang sangat bervariasi antara O (n 1 ) dan O (n 1 n 2 ) , rata-rata keluar ke O (n 1 ceil (n 2 ÷ 2)) . Dengan demikian, indexOf hanya akan menjadi yang tercepat, rata-rata, dalam kasus(n 1 , n 2 ) sama dengan {1,2} , {1,3} , atau {x, 1 | x∈N} . Namun, ini masih bukan representasi sempurna dari perangkat keras modern. IndexOf secara asli dioptimalkan sejauh yang bisa dibayangkan di sebagian besar browser modern, membuatnya sangat tunduk pada hukum prediksi cabang . Dengan demikian, jika kita membuat asumsi yang sama pada indexOf seperti yang kita lakukan dengan pencarian linear dan biner progresif - bahwa array tersebut didahului - kemudian, menurut statistik yang tercantum dalam tautan, kita dapat mengharapkan sekitar 6x kecepatan untuk IndexOf, menggeser kompleksitasnya ke antara O (n 1 ÷ 6) dan O (n 1 n 2 ), rata-rata ke O (n 1 ceil (n 2 7 ÷ 12)) . Akhirnya, perhatikan bahwa solusi di bawah ini tidak akan pernah berfungsi dengan objek karena objek dalam JavaScript tidak dapat dibandingkan dengan pointer dalam JavaScript.
Silakan lihat posting saya yang lain di sini untuk rincian lebih lanjut tentang algoritma pencarian biner yang digunakan
Jika Anda tidak yakin tentang ukuran file (yang saya hormati), maka Anda dapat mengorbankan sedikit kinerja untuk mengurangi ukuran file dan meningkatkan pemeliharaan.
Untuk membuktikan perbedaan kecepatan, mari kita periksa beberapa JSPerfs. Untuk memfilter array 16 elemen , pencarian biner kira-kira 17% lebih cepat dari indexOf sementara filterArrayByAnotherArray kira-kira 93% lebih cepat dari indexOf. Untuk memfilter array 256 elemen , pencarian biner kira-kira 291% lebih cepat daripada indexOf sementara filterArrayByAnotherArray kira-kira 353% lebih cepat dari indexOf. Untuk memfilter array 4096 elemen , pencarian biner kira-kira 2655% lebih cepat daripada indexOf sementara filterArrayByAnotherArray kira-kira 4627% lebih cepat daripada indexOf.
Filter balik (seperti gerbang AND)
Bagian sebelumnya menyediakan kode untuk mengambil larik A dan larik B, dan menghapus semua elemen dari A yang ada di B:
Bagian selanjutnya ini akan menyediakan kode untuk pemfilteran terbalik, tempat kami menghapus semua elemen dari A yang TIDAK ada di B. Proses ini secara fungsional setara dengan hanya mempertahankan elemen yang sama untuk A dan B, seperti gerbang AND:
Berikut adalah kode untuk pemfilteran terbalik:
Untuk versi yang lebih kecil dari kode penyaringan balik, lihat di bawah.
sumber
OA juga dapat diimplementasikan dalam ES6 sebagai berikut
ES6:
sumber
Deskripsi yang
filter
berfungsi terbaik adalah https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Array/filterAnda cukup mengkondisikan fungsi:
Dan Anda tidak dapat mengakses nilai variabel sebelum ditugaskan
sumber
Anda dapat mengatur fungsi filter untuk beralih ke "array filter".
sumber
Anda dapat menggunakan filter dan kemudian untuk fungsi filter gunakan pengurangan array filter yang memeriksa dan mengembalikan true ketika menemukan kecocokan kemudian balikkan pada pengembalian (!). Fungsi filter disebut sekali per elemen dalam array. Anda tidak melakukan perbandingan elemen apa pun dalam fungsi di pos Anda.
sumber
sumber
sumber
Array pemfilteran yang lebih fleksibel dari array lain yang berisi properti objek
sumber
Anda dapat menulis fungsi generik filterByIndex () dan memanfaatkan tipe inferensi di TS untuk menyimpan kerumitan dengan fungsi callback:
katakanlah Anda memiliki array [1,2,3,4] yang ingin Anda filter () dengan indeks yang ditentukan dalam array [2,4].
fungsi byIndex mengharapkan fungsi elemen dan array dan terlihat seperti ini:
hasilnya kemudian
sumber
Contoh berikut digunakan
new Set()
untuk membuat array yang difilter yang hanya memiliki elemen unik:Array dengan tipe data primitif: string, angka, boolean, null, undefined, simbol:
Array dengan objek sebagai item:
sumber
Di bawah ini adalah contohnya
sumber
Solusi Jack Giffin sangat bagus tetapi tidak bekerja untuk array dengan angka lebih besar dari 2 ^ 32. Di bawah ini adalah versi refactored, cepat untuk memfilter array berdasarkan solusi Jack tetapi berfungsi untuk array 64-bit.
sumber