Bagaimana cara menghapus kosong elemen dari sebuah array di JavaScript?
Ada cara mudah, atau apakah saya perlu untuk loop melalui itu dan menghapusnya secara manual?
var arr = [1,2,,3,,-3,null,,0,,undefined,4,,4,,5,,6,,,,];
arr.filter(n => n)
// [1, 2, 3, -3, 4, 4, 5, 6]
arr.filter(Number)
// [1, 2, 3, -3, 4, 4, 5, 6]
arr.filter(Boolean)
// [1, 2, 3, -3, 4, 4, 5, 6]
atau - (hanya untuk single array item type "text")
['','1','2',3,,'4',,undefined,,,'5'].join('').split('');
// output: ["1","2","3","4","5"]
atau - cara Klasik: iterasi sederhana
var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
len = arr.length, i;
for(i = 0; i < len; i++ )
arr[i] && arr.push(arr[i]); // copy non-empty values to the end of the array
arr.splice(0 , len); // cut the array and leave only the non-empty values
arr // [1,2,3,3,[],Object{},5,6]
var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];
arr = $.grep(arr,function(n){ return n == 0 || n });
arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]
var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,],
temp = [];
for(let i of arr)
i && temp.push(i); // copy each non-empty value to the 'temp' array
arr = temp;
arr // [1, 2, 3, 3, 4, 4, 5, 6]
['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)
// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]
EDIT: pertanyaan Ini dijawab hampir sembilan tahun yang lalu ketika ada tidak banyak berguna built-in metode dalam Array.prototipe
.
Sekarang, tentu saja, saya akan merekomendasikan anda untuk menggunakan filter
metode.
Mengambil diingat bahwa metode ini akan mengembalikan anda a baru array dengan unsur-unsur yang lulus kriteria fungsi callback yang anda berikan.
Misalnya, jika anda ingin menghapus null
atau undefined
nilai-nilai:
var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];
var filtered = array.filter(function (el) {
return el != null;
});
console.log(filtered);
Itu akan tergantung pada apa yang anda anggap sebagai "kosong" misalnya, jika anda sedang berhadapan dengan string, fungsi di atas tidak't menghapus elemen yang merupakan string kosong.
Salah satu pola yang khas yang saya lihat sering digunakan adalah untuk menghapus elemen-elemen yang falsy, termasuk string kosong ","
, 0
, NaN
, null
, undefined
, dan palsu
.
Anda dapat lulus ke filter
metode Boolean
fungsi constructor, atau mengembalikan unsur yang sama dalam kriteria filter fungsi, misalnya:
var filtered = array.filter(Boolean);
Atau
var filtered = array.filter(function(el) { return el; });
Dalam kedua cara ini bekerja karena filter
metode dalam kasus pertama, panggilan Boolean
konstruktor sebagai fungsi, konversi nilai, dan dalam kasus kedua, filter
metode internal ternyata nilai kembali dari balik secara implisit untuk Boolean
.
Jika anda bekerja dengan array jarang, dan anda mencoba untuk menyingkirkan "lubang", anda dapat menggunakan filter
lewat metode callback yang mengembalikan benar, misalnya:
var sparseArray = [0, , , 1, , , , , 2, , , , 3],
cleanArray = sparseArray.filter(function () { return true });
console.log(cleanArray); // [ 0, 1, 2, 3 ]
Tua menjawab: Don't melakukan hal ini!
Saya menggunakan metode ini, memperpanjang asli Array prototipe:
Array.prototype.clean = function(deleteValue) {
for (var i = 0; i < this.length; i++) {
if (this[i] == deleteValue) {
this.splice(i, 1);
i--;
}
}
return this;
};
test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);
Atau anda hanya bisa mendorong unsur-unsur yang ada dalam array lain:
// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
var newArray = new Array();
for (var i = 0; i < actual.length; i++) {
if (actual[i]) {
newArray.push(actual[i]);
}
}
return newArray;
}
cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);
Jika anda perlu untuk menghapus SEMUA nilai kosong ("", null, terdefinisi dan 0):
arr = arr.filter(function(e){return e});
Untuk menghapus nilai-nilai kosong dan Baris:
arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});
Contoh:
arr = ["hello",0,"",null,undefined,1,100," "]
arr.filter(function(e){return e});
Kembali:
["hello", 1, 100, " "]
UPDATE (berdasarkan Alnitak's komentar)
Dalam beberapa situasi, anda mungkin ingin menjaga "0" dalam array dan menghapus apa pun (null, terdefinisi dan ","), ini adalah salah satu cara:
arr.filter(function(e){ return e === 0 || e });
Kembali:
["hello", 0, 1, 100, " "]
Hanya satu kapal:
[1, false, "", undefined, 2].filter(Boolean); // [1, 2]
atau menggunakan underscorejs.org:
_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]
Jika anda've punya Javascript 1.6 atau yang lebih baru anda dapat menggunakan Array.filter
menggunakan sepele kembali benar
fungsi callback, misalnya:
arr = arr.filter(function() { return true; });
sejak .filter
secara otomatis melompat hilang elemen dalam array asli.
MDN halaman terkait di atas juga mengandung kesalahan-memeriksa versi filter
yang dapat digunakan dalam JavaScript interpreter yang don't mendukung versi resmi.
Catatan bahwa ini tidak akan menghapus null
entri atau entri dengan eksplisit undefined
nilai, tapi OP diminta secara khusus "hilang" entri.
Untuk menghilangkan lubang, anda harus menggunakan
arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this
Untuk menghilangkan lubang, dan, falsy (null, undefined, 0, -0, NaN, "", palsu, dokumen.semua) nilai-nilai:
arr.filter(x => x)
Untuk menghilangkan lubang, null, dan, undefined:
arr.filter(x => x != null)
arr = [, null, (void 0), 0, -0, NaN, false, '', 42];
console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, NaN, false, '', 42]
console.log(arr.filter(x => x)); // [42]
console.log(arr.filter(x => x != null)); // [0, -0, NaN, false, "", 42]
Dengan Garis Bawah/Lodash:
Secara umum use case:
_.without(array, emptyVal, otherEmptyVal);
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
Dengan mengosongkan:
_.without(['foo', 'bar', '', 'baz', '', '', 'foobar'], '');
--> ["foo", "bar", "baz", "foobar"]
Jika menggunakan perpustakaan adalah pilihan saya tahu underscore.js memiliki fungsi yang disebut kompak() http://documentcloud.github.com/underscore/ ini juga memiliki beberapa fungsi yang berguna lainnya yang berkaitan dengan array dan koleksi.
Berikut adalah kutipan dari dokumentasi mereka:
_.kompak(array)
Mengembalikan copy dari array dengan semua falsy nilai-nilai yang dihapus. Dalam JavaScript, false, null, 0, "", terdefinisi dan NaN semua falsy.
_.kompak([0, 1, false, 2, '', 3]);
=> [1, 2, 3]
@Alnitak
Sebenarnya Array.filter bekerja pada semua browser jika anda menambahkan beberapa kode tambahan. Lihat di bawah ini.
var array = ["","one",0,"",null,0,1,2,4,"two"];
function isempty(x){
if(x!=="")
return true;
}
var res = array.filter(isempty);
document.writeln(res.toJSONString());
// gives: ["one",0,null,0,1,2,4,"two"]
Ini adalah kode yang perlu anda tambahkan untuk IE, tapi filter dan Fungsional programmingis layak adalah imo.
//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license
if (!Array.prototype.filter)
{
Array.prototype.filter = function(fun /*, thisp*/)
{
var len = this.length;
if (typeof fun != "function")
throw new TypeError();
var res = new Array();
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in this)
{
var val = this[i]; // in case fun mutates this
if (fun.call(thisp, val, i, this))
res.push(val);
}
}
return res;
};
}
Karena tidak ada orang lain yang disebutkan itu dan kebanyakan orang telah menggarisbawahi termasuk dalam proyek mereka, anda juga dapat menggunakan _.tanpa(array, nilai*);
.
_.without(["text", "string", null, null, null, "text"], null)
// => ["text", "string", "text"]
ES6: let newArr = arr.filter(e => e);
Anda mungkin merasa lebih mudah untuk loop melalui array anda dan membangun sebuah array baru keluar dari item yang anda inginkan untuk menjaga dari array dari loop dan sambatan seperti yang telah dikemukakan, sejak memodifikasi panjang array saat itu sedang melingkar di atas dapat memperkenalkan masalah.
Anda bisa melakukan sesuatu seperti ini:
function removeFalsyElementsFromArray(someArray) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(someArray[index]) {
newArray.push(someArray[index]);
}
}
return newArray;
}
Sebenarnya di sini adalah yang lebih generik solusi:
function removeElementsFromArray(someArray, filter) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(filter(someArray[index]) == false) {
newArray.push(someArray[index]);
}
}
return newArray;
}
// then provide one or more filter functions that will
// filter out the elements based on some condition:
function isNullOrUndefined(item) {
return (item == null || typeof(item) == "undefined");
}
// then call the function like this:
var myArray = [1,2,,3,,3,,,,,,4,,4,,5,,6,,,,];
var results = removeElementsFromArray(myArray, isNullOrUndefined);
// results == [1,2,3,3,4,4,5,6]
Anda mendapatkan ide - anda kemudian bisa memiliki jenis lain dari fungsi filter. Mungkin lebih dari yang anda butuhkan, tapi aku merasa murah hati... ;)
I'm hanya menambahkan suara saya di atas "panggilan ES5's Array..filter()
dengan global constructor" golf-hack, tapi saya sarankan menggunakan Objek
bukan String
, Boolean
, atau Nomor
seperti yang disarankan di atas.
Secara khusus, ES5's filter()
sudah doesn't pemicu undefined
elemen-elemen dalam array, sehingga fungsi yang universal mengembalikan true
, yang kembali semua unsur-unsur filter()
hits, tentu akan kembali non-undefined
unsur-unsur:
> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(function(){return true})
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]
Namun, menulis ...(function(){return true;})
yang lebih lama daripada menulis ...(Objek)
; dan return-nilai Objek
konstruktor akan, di bawah keadaan apapun, beberapa jenis objek. Tidak seperti primitif-tinju-konstruktor yang disarankan di atas, tidak mungkin objek-nilai falsey, dan dengan demikian dalam pengaturan boolean, Objek
adalah tangan pendek untuk function(){return true}
.
> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(Object)
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]
Ketika menggunakan tertinggi memilih jawaban di atas, contoh pertama, saya mendapatkan karakter individu untuk string dengan panjang lebih besar dari 1. Di bawah adalah solusi untuk masalah itu.
var stringObject = ["", "some string yay", "", "", "Other string yay"];
stringObject = stringObject.filter(function(n){ return n.length > 0});
Bukan tidak kembali jika tidak terdefinisi, kita kembali jika suhu udara lebih besar dari 0. Harapan yang membantu seseorang di luar sana.
Kembali
["some string yay", "Other string yay"]
var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })
console.log(r)
[1,2,3]