Saya mencari cara yang efisien untuk menghapus semua elemen dari array javascript jika mereka ada di array lain.
// If I have this array:
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
// and this one:
var toRemove = ['b', 'c', 'g'];
Saya ingin beroperasi di myArray agar tetap seperti ini: ['a', 'd', 'e', 'f']
Dengan jQuery, saya menggunakan grep()
dan inArray()
, yang berfungsi dengan baik:
myArray = $.grep(myArray, function(value) {
return $.inArray(value, toRemove) < 0;
});
Apakah ada cara javascript murni untuk melakukan ini tanpa perulangan dan splicing?
javascript
arrays
Keran
sumber
sumber
.filter()
. Sebagai gantinya Anda akan menggunakanfor
loop. Anda dapat menghindari.splice()
jika pesanan asli tidak perlu dipertahankan. Atau ada cara untuk membuat.splice()
lebih efisien jika Anda berpikir akan ada banyak item untuk dihapus.Jawaban:
Gunakan
Array.filter()
metode:Peningkatan kecil, karena dukungan browser untuk
Array.includes()
telah meningkat:Adaptasi berikutnya menggunakan fungsi panah :
sumber
.difference()
yang pada dasarnya melakukan ini.toRemove()
ke huruf besar dan ubah panggilan balik dariel
menjadiel.toUpperCase()
.myArray = myArray.filter( el => !toRemove.includes( el ) );
The
filter
Metode harus melakukan trik:Jika
toRemove
array Anda besar, pola pencarian semacam ini bisa jadi tidak efisien. Akan lebih berkinerja untuk membuat peta sehingga pencarianO(1)
lebih daripadaO(n)
.sumber
Jika Anda menggunakan berbagai objek. Maka kode di bawah ini harus melakukan keajaiban, di mana properti objek akan menjadi kriteria untuk menghapus item duplikat.
Dalam contoh di bawah ini, duplikat telah dihapus dengan membandingkan nama setiap item.
Coba contoh ini. http://jsfiddle.net/deepak7641/zLj133rh/
sumber
Lodash memiliki fungsi utilitas untuk ini juga: https://lodash.com/docs#difference
sumber
ECMAScript 6 set dapat digunakan untuk menghitung elemen yang berbeda dari dua array:
sumber
Saya baru saja menerapkan sebagai:
Digunakan sebagai:
sumber
prototypes
Objek asli, seperti ituArray
. Itu bisa memiliki konflik jangka panjang dengan perkembangan bahasa di masa depan ( lihatflatten
kasusnya )Jika Anda tidak dapat menggunakan hal-hal ES5 baru seperti itu
filter
saya pikir Anda terjebak dengan dua loop:sumber
sumber
Sekarang dalam rasa one-liner:
Mungkin tidak berfungsi di browser lama.
sumber
Anda dapat menggunakan _.differenceBy dari lodash
Contoh kode di sini: CodePen
sumber
Bagaimana dengan yang paling sederhana:
sumber
includes
itu tidak tersedia sebelum ES7.Cara yang tepat untuk menghapus semua elemen yang terdapat dalam array lain adalah dengan membuat array sumber objek yang sama dengan menghapus hanya elemen:
Atau yang setara dengan CoffeeScript:
Pengujian di dalam alat dev krom:
Menggunakan kerangka kerja Angular adalah cara terbaik untuk menjaga pointer ke objek sumber saat Anda memperbarui koleksi tanpa jumlah besar pengamat dan memuat ulang.
sumber
Saya membangun logika tanpa menggunakan metode bawaan, beri tahu saya optimasi atau modifikasi apa pun. Saya diuji dalam editor JS itu berfungsi dengan baik.
sumber