Kako odstranim prazne elemente iz polja v javascriptu?
Ali obstaja enostaven način ali moram po njem potegniti zanko in jih odstraniti ročno?
EDIT: Na to vprašanje je bilo odgovorjeno pred skoraj devetimi leti, ko v prototipu Array.prototype
še ni bilo veliko uporabnih vgrajenih metod.
Zdaj vam vsekakor priporočam uporabo metode filter
.
Upoštevajte, da vam bo ta metoda vrnila novo polje z elementi, ki ustrezajo kriterijem povratne funkcije, ki ste ji jo posredovali.
Na primer, če želite odstraniti vrednosti null
ali undefined
:
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);
To je odvisno od tega, kaj štejete za "prazno" na primer, če bi imeli opravka z nizi, zgornja funkcija ne bi odstranila elementov, ki so prazen niz.
Tipičen vzorec, ki se pogosto uporablja, je odstranjevanje elementov, ki so falsy, ki vključujejo prazen niz ""
, 0
, NaN
, null
, undefined
in false
.
Metodi filter
lahko posredujete funkcijo konstruktorja Boolean
ali pa na primer vrnete isti element v funkciji merila filtra:
var filtered = array.filter(Boolean);
Ali .
var filtered = array.filter(function(el) { return el; });
V obeh primerih to deluje, ker metoda filter
v prvem primeru kliče konstruktor Boolean
kot funkcijo, ki pretvori vrednost, v drugem primeru pa metoda filter
interno implicitno spremeni povratno vrednost povratnega klica v Boolean
.
Če delate z redkimi polji in se želite znebiti "lukenj", lahko uporabite metodo filter
, ki posreduje povratni klic, ki vrne true, na primer:
var sparseArray = [0, , , 1, , , , , 2, , , , 3],
cleanArray = sparseArray.filter(function () { return true });
console.log(cleanArray); // [ 0, 1, 2, 3 ]
Stari odgovor: Ne počnite tega!
Uporabljam to metodo, ki razširja izvirni prototip polja:
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);
Lahko pa obstoječe elemente preprosto potisnete v drugo polje:
// 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,,,,]);
Morda boste lažje naredili zanko nad svojim poljem in iz elementov, ki jih želite ohraniti iz polja, sestavili novo polje, kot pa da bi poskušali narediti zanko in spajanje, kot je bilo predlagano, saj lahko spreminjanje dolžine polja med zanko povzroči težave.
Lahko bi naredili nekaj takega:
function removeFalsyElementsFromArray(someArray) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(someArray[index]) {
newArray.push(someArray[index]);
}
}
return newArray;
}
Pravzaprav je tu bolj splošna rešitev:
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]
Zamisel je jasna - lahko bi imeli tudi druge vrste funkcij filtrov. Verjetno je to več, kot potrebujete, vendar sem bil radodaren... ;)
Poskusite to. Posredujte mu svoje polje in vrnil vam bo odstranjene prazne elemente. *Posodobljeno za odpravo napake, na katero je opozoril Jason
function removeEmptyElem(ary) {
for (var i = ary.length - 1; i >= 0; i--) {
if (ary[i] == undefined) {
ary.splice(i, 1);
}
}
return ary;
}