在Javascript中删除数组中的空元素

如何在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_的元素,包括空字符串""0NaNnullundefinedfalse

你可以传递给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,,,,]);
评论(18)

你可能会发现在你的数组上进行循环,并从你想保留的数组中建立一个新的数组,要比按照建议进行循环和拼接更容易,因为在循环过程中修改数组的长度会带来问题。

你可以这样做。

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]

你会明白的--然后你可以有其他类型的过滤功能。可能比你需要的要多,但我觉得很慷慨...;)

评论(0)

试试这个。 把你的数组传给它,它就会在返回时删除空元素。 *为了解决Jason指出的问题,已经更新了。

function removeEmptyElem(ary) {
    for (var i = ary.length - 1; i >= 0; i--) {
        if (ary[i] == undefined)  {
            ary.splice(i, 1);
        }       
    }
    return ary;
}
评论(5)