如何在JavaScript中删除数组中的空元素?
是否有一个直接的方法,或者我需要循环浏览并手动删除它们?
编辑:这个问题几乎是在九年前回答的,当时Array.prototype
中还没有很多有用的内置方法。
现在,当然,我建议你使用filter
方法。
请记住,这个方法将返回一个新的数组,其中的元素将通过你提供给它的回调函数的标准。
例如,如果你想删除 "空 "或 "未定义 "的值。
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);
这取决于你认为什么是"空",例如,如果你处理的是字符串,上述函数就不会删除属于空字符串的元素。
我看到经常使用的一个典型模式是删除_falsy_的元素,包括空字符串""
、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.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]
你会明白的--然后你可以有其他类型的过滤功能。可能比你需要的要多,但我觉得很慷慨...;)