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

1601

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

有没有简单直接的方法,还是必须手动循环并逐个删除?


27
如果你的问题能够明确指出“空元素”指的是什么,那将会很有帮助,因为这里的大部分答案(在我看来)错误地将其解释为“假值”元素。注意:var a = [,,]var a = [undefined, undefined]之间存在区别。前者是真正的空数组,而后者实际上有两个键,但值为undefined - Alnitak
虽然不是完全的答案,但我认为在数组中尽可能避免使用null/undefined是更好的实践。例如,如果你的null来自于使用map函数映射另一个数组时,对于某些元素返回null,那么在运行map之前尝试使用Array.filter过滤掉这些元素。这样可以使你的代码更易读/自我记录。显然,这并不适用于每种情况,但它可以应用于很多情况。 - Luke Redmore
51个回答

1
使用array.filter(String);可以从数组中移除所有空元素。它会返回javascript数组中的所有非空元素。

1
遗憾的是,使用Boolean会将其移除为空字符串,而同时接受null - Paul Watson
1
@PaulWatson 是的,不幸的是它会将null作为字符串接受,但可以从数组中删除空元素。希望你能理解。 - Bhupesh Kumar
它甚至不能很好地工作。它应该删除“非空元素”(假定存在元素,删除所有空槽),但它也过滤掉空字符串和空数组。如果它应该过滤掉* falsy *值,那么它实际上会留下null0。无论它应该如何工作...都没有用。特别是如果我们考虑任何可能具有自定义toString()定义的内容,这可能导致进一步将项目视为falsy而实际上不是。 - VLAZ

1

最简单的方法

[NaN、undefined、null、0、1、2、2000、Infinity] .filter(Boolean)


1

这个是有效的,我在AppJet中测试过(你可以将代码复制粘贴到它的IDE中,然后按下“重新加载”来查看它的运行情况,不需要创建账户)

/* 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]
*/

1
这似乎只是“偶然”生效,因为通过 for ... in 枚举键实际上会导致跳过缺失的元素。对于 undefined 的测试仅用于删除明确设置为该值的实际元素。 - Alnitak

1

我就是这样简单地做。

const arr = ['apple', '', 'orange', '', 'banana', ''];

const filteredArr = arr.filter(function(element) {
  return element !== '';
});

console.log(filteredArr); // ['apple', 'orange', 'banana']

0

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

不幸的是,Array.prototype.filter()不受IE<9的支持。如果您仍然需要支持IE8或更早版本的IE,则可以使用以下polyfill在这些浏览器中添加对Array.prototype.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;
  };
}

0

如果有人想要清空整个数组或对象,这可能会有所帮助。

var qwerty = {
    test1: null,
    test2: 'somestring',
    test3: 3,
    test4: {},
    test5: {
        foo: "bar"
    },
    test6: "",
    test7: undefined,
    test8: " ",
    test9: true,
    test10: [],
    test11: ["77","88"],
    test12: {
        foo: "foo",
        bar: {
            foo: "q",
            bar: {
                foo:4,
                bar:{}
            }
        },
        bob: {}
    }
}

var asdfg = [,,"", " ", "yyyy", 78, null, undefined,true, {}, {x:6}, [], [2,3,5]];

function clean_data(obj) {
    for (var key in obj) {
        // Delete null, undefined, "", " "
        if (obj[key] === null || obj[key] === undefined || obj[key] === "" || obj[key] === " ") {
            delete obj[key];
        }
        // Delete empty object
        // Note : typeof Array is also object
        if (typeof obj[key] === 'object' && Object.keys(obj[key]).length <= 0) {
            delete obj[key];
        }
        // If non empty object call function again
        if(typeof obj[key] === 'object'){
            clean_data(obj[key]);
        }
    }
    return obj;
}

var objData = clean_data(qwerty);
console.log(objData);
var arrayData = clean_data(asdfg);
console.log(arrayData);

输出:

移除任何nullundefined""" "空对象空数组

jsfiddle 这里


0
如果您正在使用NodeJS,可以使用clean-deep包。请先使用npm i clean-deep命令安装。
const cleanDeep = require('clean-deep');
var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];
const filterd = cleanDeep(array);
console.log(filterd);

0
使用过滤器来移除数组中的空字符串。

var s = [ '1,201,karthikeyan,K201,HELPER,karthikeyan.a@limitlessmobil.com,8248606269,7/14/2017,45680,TN-KAR24,8,800,1000,200,300,Karthikeyan,11/24/2017,Karthikeyan,11/24/2017,AVAILABLE\r',
  '' ]
var newArr = s.filter(function(entry) { return entry.trim() != ''; })

console.log(newArr); 


0
大多数答案都集中在创建一个新数组,该数组是现有数组的副本,并跳过空元素。
但是,如果您实际上想要从现有数组中删除空元素呢?最直接的方法是:
const some_array = [ 0, 1, undefined, "something", "", null, {}, , ]

for (let i = 0; i < some_array.length; ) {  // iterate some_array
  if (some_array[i] == null) {              // if empty
    some_array.splice(i, 1)                 // splice one element out of array
                                            // and do not advance to next element
                                            // (splice moves the next element to current position)
  } else {
    ++i                                     // else advance to next element
  }
}

请注意== null的比较,它可以捕获undefinednull和空元素,但不包括0""

0

这个方法只会删除空值而不是假值,我认为这更可取。

还有一个选项可以删除 null 值。

使用这种方法应该比使用 splice 更快。

    function cleanArray(a, removeNull) {
        var i, l, temp = [];
        l = a.length;
        if (removeNull) {
            for (i = 0; i < l; i++) {
                if (a[i] !== undefined && a[i] !== null) {
                    temp.push(a[i]);
                }
            }
        } else {
            for (i = 0; i < l; i++) {
                if (a[i] !== undefined) {
                    temp.push(a[i]);
                }
            }
        }
        a.length = 0;
        l = temp.length;
        for (i = 0; i < l; i++) {
            a[i] = temp[i];
        }
        temp.length = 0;
        return a;
    }
    var myArray = [1, 2, , 3, , 3, , , 0, , null, false, , NaN, '', 4, , 4, , 5, , 6, , , , ];
    cleanArray(myArray);
    myArray;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接