Bagaimana cara menghapus elemen kosong dari array di JavaScript?
Apakah ada cara yang mudah, atau apakah saya perlu mengulanginya dan menghapusnya secara manual?
javascript
arrays
node.js
Tamas Czinege
sumber
sumber
var a = [,,]
danvar a = [undefined, undefined]
. Yang pertama benar-benar kosong, tetapi yang terakhir sebenarnya memiliki dua kunci, tetapi denganundefined
nilai.Jawaban:
EDIT: Pertanyaan ini dijawab hampir sembilan tahun yang lalu ketika tidak ada banyak metode built-in yang berguna di
Array.prototype
.Sekarang, tentu saja, saya akan merekomendasikan Anda untuk menggunakan
filter
metode ini.Ingatlah bahwa metode ini akan mengembalikan Anda array baru dengan elemen yang melewati kriteria fungsi callback yang Anda berikan kepadanya.
Misalnya, jika Anda ingin menghapus
null
atauundefined
menghargai:Itu akan tergantung pada apa yang Anda anggap "kosong" misalnya, jika Anda berurusan dengan string, fungsi di atas tidak akan menghapus elemen yang merupakan string kosong.
Salah satu pola khas yang saya lihat sering digunakan adalah untuk menghapus elemen yang falsy , yang meliputi string kosong
""
,0
,NaN
,null
,undefined
, danfalse
.Anda bisa meneruskan ke
filter
metode,Boolean
fungsi konstruktor, atau mengembalikan elemen yang sama di fungsi kriteria filter, misalnya:Atau
Dalam kedua cara, ini berfungsi karena
filter
metode dalam kasus pertama, memanggilBoolean
konstruktor sebagai fungsi, mengubah nilai, dan dalam kasus kedua,filter
metode ini secara internal mengubah nilai balik dari callback secara implisitBoolean
.Jika Anda bekerja dengan array jarang, dan Anda mencoba untuk menyingkirkan "lubang", Anda dapat menggunakan
filter
metode yang melewati panggilan balik yang mengembalikan true, misalnya:Jawaban lama: Jangan lakukan ini!
Saya menggunakan metode ini, memperluas prototipe Array asli:
Atau Anda cukup mendorong elemen yang ada ke array lain:
sumber
splice
panggilan benar-benar mahal di browser lama karena harus nomor baru semua kunci array untuk menutup kesenjangan.Array.prototype
Object.defineProperty
.hasOwnProperty
Cara sederhana:
atau - (hanya untuk item array tunggal jenis "teks")
atau - Cara klasik: iterasi sederhana
via jQuery:
UPDATE - cara cepat dan keren lainnya (menggunakan ES6):
Hapus nilai kosong
sumber
arr = arr.filter(function(n){return n; });
foo.join("").split("")
sepertinya hanya berfungsi jika string adalah karakter tunggalarr.filter(e=>e)
dan ini dapat dirantai dengan peta, mengurangi, dll.Jika Anda perlu menghapus SEMUA nilai kosong ("", null, tidak terdefinisi dan 0):
Untuk menghapus nilai kosong dan Line break:
Contoh:
Kembali:
UPDATE (berdasarkan komentar Alnitak)
Dalam beberapa situasi Anda mungkin ingin tetap "0" dalam array dan menghapus yang lain (null, undefined dan ""), ini adalah salah satu cara:
Kembali:
sumber
function(e){return !!e}
!!e
akan termasuk NaN (tidak seperti 0) dimanae
tidak akan (seperti 0).var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);
menghapus undefined, "" dan 0Cukup satu liner:
atau menggunakan underscorejs.org :
sumber
Boolean
berfungsi sebagai fungsi ...Boolean
sebagai fungsi, ia hanya akan mengembalikantrue
ataufalse
apakah nilainya benar / salah.(true).constructor === Boolean
,. Dan kemudian beri tahu saya jika kami bisa melakukan ini dengan build-in lain di JS. ;)) (tentu saja tidak termasuk 5 konstruktor build lainnya. (String, Array, Object, Function, Number))Jika Anda memiliki Javascript 1.6 atau lebih baru Anda dapat menggunakan
Array.filter
menggunakanreturn true
fungsi panggilan balik sepele , misalnya:karena
.filter
secara otomatis melewatkan elemen yang hilang dalam array asli.Halaman MDN yang ditautkan di atas juga berisi versi pemeriksaan kesalahan yang bagus
filter
yang dapat digunakan dalam penerjemah JavaScript yang tidak mendukung versi resmi.Perhatikan bahwa ini tidak akan menghapus
null
entri atau entri denganundefined
nilai eksplisit , tetapi OP secara khusus meminta entri "hilang".sumber
undefined
nilai yang diberikan.Untuk menghilangkan lubang, Anda harus menggunakan
Untuk menghapus nilai hole, dan, falsy (null, undefined, 0, -0, NaN, "", false, document.all):
Untuk menghapus lubang, null, dan, tidak terdefinisi:
sumber
[, ,]
arr.filter(x => x)
, JS akan memeriksa apakah x benar atau salah, yaituif (x)
, oleh karena itu hanya nilai kebenaran akan ditugaskan ke daftar baru.Cara bersih untuk melakukannya.
sumber
undefined
; ini pada dasarnya menghapus semua nilai falsy.ES6 sederhana
sumber
[1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v)
.Dengan Garis Bawah / Lodash:
Kasus penggunaan umum:
Dengan kosong:
Lihat dokumentasi lodash untuk tanpa .
sumber
ES6
Metode adil dan versi yang lebih baru, anggap array di bawah ini:Cara sederhana:
sumber
Jika menggunakan pustaka adalah opsi, saya tahu underscore.js memiliki fungsi yang disebut compact () http://documentcloud.github.com/underscore/ juga memiliki beberapa fungsi berguna lainnya yang terkait dengan array dan koleksi.
Berikut adalah kutipan dari dokumentasinya:
sumber
@Alnitak
Sebenarnya Array.filter bekerja di semua browser jika Anda menambahkan beberapa kode tambahan. Lihat di bawah.
Ini adalah kode yang perlu Anda tambahkan untuk IE, tetapi filter dan Pemrograman fungsional nilainya imo.
sumber
Karena tidak ada orang lain yang menyebutkannya dan kebanyakan orang memiliki garis bawah yang termasuk dalam proyek mereka, Anda juga dapat menggunakannya
_.without(array, *values);
.sumber
ES6:
sumber
Anda mungkin merasa lebih mudah untuk mengulang array dan membangun array baru dari item yang ingin Anda simpan dari array daripada dengan mencoba untuk loop dan splice seperti yang disarankan, karena memodifikasi panjang array saat sedang di-loop. lebih dapat menimbulkan masalah.
Anda dapat melakukan sesuatu seperti ini:
Sebenarnya di sini ada solusi yang lebih umum:
Anda mendapatkan idenya - Anda kemudian dapat memiliki jenis fungsi filter lainnya. Mungkin lebih dari yang Anda butuhkan, tetapi saya merasa murah hati ...;)
sumber
Bagaimana dengan ini (ES6): Untuk menghapus nilai Falsy dari array.
sumber
Anda harus menggunakan filter untuk mendapatkan array tanpa elemen kosong. Contoh pada ES6
sumber
Saya hanya menambahkan suara saya di atas “sebut ES5 ini
Array..filter()
dengan konstruktor global” golf-hack, tapi saya sarankan untuk menggunakanObject
bukanString
,Boolean
atauNumber
seperti yang disarankan di atas.Secara khusus, ES5
filter()
sudah tidak memicuundefined
elemen dalam array; jadi fungsi yang secara universal mengembalikantrue
, yang mengembalikan semua elemen yangfilter()
terkena, hanya akan menghasilkan non-undefined
elemen:Namun, menulis
...(function(){return true;})
lebih panjang dari menulis...(Object)
; dan nilai pengembalianObject
konstruktor akan, dalam keadaan apa pun , semacam objek. Berbeda dengan konstruktor tinju-primitif yang disarankan di atas, tidak ada nilai objek yang mungkin adalah falsey, dan dengan demikian dalam pengaturan boolean,Object
adalah jalan pintas untukfunction(){return true}
.sumber
someArray.filter(String);
sebenarnya setara dengansomeArray.filter(function(x){ return String(x); });
. Jika Anda ingin menghapus semua nilai falsysomeArray.filter(Boolean);
berfungsi untuk menghapus 0, -0, NaN, false, '', null, dan undefined.Object
konstruktor sebagai lawanreturn true
metode. @robocat, OP meminta elemen kosong untuk dihapus, bukan nulls.Ketika menggunakan jawaban tertinggi di atas, contoh pertama, saya mendapatkan karakter individual dengan panjang string lebih dari 1. Di bawah ini adalah solusi saya untuk masalah itu.
Alih-alih tidak kembali jika tidak ditentukan, kami kembali jika panjangnya lebih besar dari 0. Harapan yang membantu seseorang di luar sana.
Kembali
sumber
["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123
Mengganti fungsi itu. .. dengan String, ironisnya, meninggalkan angka tetapi akan memberikan hasil yang sama dalam array yang Anda berikan.sumber
Bagaimana dengan itu:
sumber
join() === join(',')
:)Ini berfungsi, saya mengujinya di AppJet (Anda dapat menyalin-tempel kode pada IDE-nya dan tekan "muat ulang" untuk melihatnya berfungsi, tidak perlu membuat akun)
sumber
for ... in
yang sebenarnya menyebabkan melewatkan elemen yang hilang. Tesundefined
hanya berfungsi untuk menghapus elemen nyata yang secara eksplisit diatur ke nilai itu.Cara lain untuk melakukannya adalah dengan mengambil keuntungan dari properti panjang array: kemas item-item non-null di 'kiri' array, kemudian kurangi panjangnya. Ini adalah algoritma in-place -tidak mengalokasikan memori, terlalu buruk untuk pengumpul sampah-, dan memiliki perilaku kasus terbaik / rata-rata / terburuk yang sangat baik.
Solusi ini, dibandingkan dengan yang lain di sini, adalah antara 2 hingga 50 kali lebih cepat di Chrome, dan 5 hingga 50 kali lebih cepat di Firefox, seperti yang Anda lihat di sini: http://jsperf.com/remove-null-items-from-array
Kode di bawah ini menambahkan metode 'removeNull' non-enumerable ke Array, yang mengembalikan 'ini' untuk daisy-chaining:
sumber
arr.filter(e => e)
.smart
seperti kata kerja, untuk menyebabkan rasa sakit yang tajam. Ini relevan karena sakit fisik jika saya mempersenjatai ponsel saya karena komentar Anda.kembali
sumber
'Menyalahgunakan' untuk ... dalam loop (objek-anggota). => Hanya nilai-nilai kebenaran muncul di tubuh loop.
sumber
for ... in
adalah apa yang menghapus kunci yang tidak terdefinisi dari array, tetapi Anda sebenarnya tidak punya kode di sini untuk hanya menerima nilai "benar"Ini mungkin membantu Anda: https://lodash.com/docs/4.17.4#hapus
sumber
Keluaran:
Ini akan menghapus elemen kosong dari array dan menampilkan elemen lainnya.
sumber
Menghapus semua elemen kosong
Jika array berisi Objek, Array, dan String kosong bersama elemen kosong lainnya, kita bisa menghapusnya dengan:
Kompaksi sederhana (menghapus elemen kosong dari array)
Dengan ES6:
Dengan Javascript biasa ->
sumber
Memfilter entri yang tidak valid dengan ekspresi reguler
sumber
Cara terbaik untuk menghapus elemen kosong, adalah menggunakan
Array.prototype.filter()
, sebagaimana telah disebutkan dalam jawaban lain.Sayangnya,
Array.prototype.filter()
tidak didukung oleh IE <9. Jika Anda masih perlu mendukung IE8 atau versi IE yang lebih lama, Anda bisa menggunakan polyfill berikut untuk menambahkan dukunganArray.prototype.filter()
di browser ini:sumber