Как да премахна празните елементи от масив в JavaScript?
Има ли прост начин или трябва да мина през цикъла и да ги премахна ръчно?
ЕДИТ: На този въпрос беше отговорено преди почти девет години, когато нямаше много полезни вградени методи в Array.prototype
.
Сега със сигурност бих ви препоръчал да използвате метода filter
.
Имайте предвид, че този метод ще ви върне нов масив с елементите, които отговарят на критериите на функцията за обратно извикване, която сте му предоставили.
Например, ако искате да премахнете стойностите null
или 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);
Това зависи от това какво смятате за "празно" например, ако се занимавате с низове, горната функция няма да премахва елементи, които са празен низ.
Един типичен модел, който виждам често да се използва, е да се премахват елементи, които са фалшиви, които включват празен низ ""
, 0
, NaN
, null
, undefined
и false
.
Можете да предадете на метода filter
, функцията на конструктора Boolean
или да върнете същия елемент във функцията на критериите на филтъра, например:
var filtered = array.filter(Boolean);
Или
var filtered = array.filter(function(el) { return el; });
И в двата случая това работи, защото методът filter
в първия случай извиква конструктора Boolean
като функция, преобразувайки стойността, а във втория случай методът filter
вътрешно превръща връщаната стойност на обратната връзка имплицитно в Boolean
.
Ако работите с разредени масиви и се опитвате да се отървете от "дупките", можете да използвате метода filter
, като подадете обратно повикване, което връща true, например:
var sparseArray = [0, , , 1, , , , , 2, , , , 3],
cleanArray = sparseArray.filter(function () { return true });
console.log(cleanArray); // [ 0, 1, 2, 3 ]
Старият отговор: Не правете това!
Използвам този метод, като разширявам родния прототип на Array:
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);
Или можете просто да преместите съществуващите елементи в друг масив:
// 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,,,,]);
Може да ви се стори по-лесно да направите цикъл на масива и да построите нов масив от елементите, които искате да запазите от масива, отколкото да се опитате да направите цикъл и да съедините, както беше предложено, тъй като промяната на дължината на масива по време на цикъла може да доведе до проблеми.
Можете да направите нещо подобно:
function removeFalsyElementsFromArray(someArray) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(someArray[index]) {
newArray.push(someArray[index]);
}
}
return newArray;
}
Всъщност ето едно по-общо решение:
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]
Разбирате идеята - можете да имате и други видове филтърни функции. Вероятно е повече, отколкото ви е необходимо, но се чувствах щедър... ;)
Опитайте това. Предайте му вашия масив и той ще върне масива с премахнати празни елементи. *Актуализирано, за да се отстрани грешката, посочена от Джейсън
function removeEmptyElem(ary) {
for (var i = ary.length - 1; i >= 0; i--) {
if (ary[i] == undefined) {
ary.splice(i, 1);
}
}
return ary;
}