如何在JavaScript中删除数组中的空元素?

是否有一种简单的方法,或者我需要循环并手动删除它们?


当前回答

可以使用带有索引和in运算符的筛选器

设a=[1,,2,,,3];设b=a.filter((x,i)=>a中的i);console.log({a,b});

其他回答

这是可行的,我在AppJet中测试了它(你可以复制粘贴代码到它的IDE上,然后按“reload”查看它的工作情况,不需要创建帐户)

/* appjet:version 0.1 */
function Joes_remove(someArray) {
    var newArray = [];
    var element;
    for( element in someArray){
        if(someArray[element]!=undefined ) {
            newArray.push(someArray[element]);
        }
    }
    return newArray;
}

var myArray2 = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

print("Original array:", myArray2);
print("Clenased array:", Joes_remove(myArray2) );
/*
Returns: [1,2,3,3,0,4,4,5,6]
*/

几个简单的方法:

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]

或-(仅适用于“text”类型的单个数组项)

['','1','2',3,,'4',,undefined,,,'5'].join('').split(''); 
// output:  ["1","2","3","4","5"]

或-经典方式:简单迭代

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
// [1,2,3,3,[],Object{},5,6]

jQuery:

var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];
    
arr = $.grep(arr, n => n == 0 || n);
// [1, 2, 3, 3, 0, 4, 4, 5, 6]

删除空元素的最佳方法是使用Array.prototype.filter(),正如其他答案中已经提到的那样。

不幸的是,IE<9不支持Array.prototype.filter()。如果您仍然需要支持IE8或更旧版本的IE,可以使用以下polyfill在这些浏览器中添加对Array.protocol.filter()的支持:

if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun/*, thisArg*/) {
    'use strict';
    if (this === void 0 || this === null) {
      throw new TypeError();
    }
    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function') {
      throw new TypeError();
    }
    var res = [];
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++) {
      if (i in t) {
        var val = t[i];
        if (fun.call(thisArg, val, i, t)) {
          res.push(val);
        }
      }
    }
    return res;
  };
}

要从数组中删除未定义的元素,只需使用

常量数组=[{name:“tim”,年龄:1},未定义,{姓名:“ewrfer”,年龄:22岁},{姓名:“3tf5gh”,年龄:56},无效的{姓名:“kygm”,年龄:19岁},未定义,];console.log(array.filter(布尔));

编辑:这个问题几乎在九年前就得到了回答,当时Array.prototype中没有太多有用的内置方法。

现在,当然,我建议您使用过滤方法。

请记住,此方法将返回一个新数组,其中包含传递给它的回调函数的条件的元素。

例如,如果要删除空值或未定义的值:

var array=[0,1,null,2,“”,3,undefined,3,,,,4,,,5,,6,,,];var filtered=array.filter(函数(el){返回el!=无效的});console.log(已过滤);

这取决于你认为什么是“空”的。例如,如果你处理字符串,上面的函数不会删除空字符串的元素。

我经常看到的一个典型模式是删除错误的元素,其中包括空字符串“”、0、NaN、null、undefined和false。

您可以传递给筛选方法、布尔构造函数或返回筛选条件函数中的相同元素,例如:

var filtered = array.filter(Boolean);

Or

var filtered = array.filter(function(el) { return el; });

在这两种情况下,这都是有效的,因为在第一种情况下过滤器方法将布尔构造函数作为函数调用,转换值,而在第二种情况下过滤方法在内部将回调的返回值隐式转换为布尔值。

如果您正在使用稀疏数组,并且正在尝试消除“空洞”,则可以使用filter方法传递返回true的回调,例如:

var spareArray=[0,,1,,,2,,3],cleanArray=sparseArray.filter(函数(){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,,,,]);