如何从JavaScript中的数组中删除null,undefined,NaN,0s,falses和空字符串?

时间:2016-03-18 04:24:25

标签: javascript arrays

我编写了一个脚本,使用.splice()删除任何null,undefined,0,false或空字符串值,但代码只删除了NaN和0。

以下是我的尝试:

function remove(arr){ // input [NaN, 0, 15, false, -22, '',undefined, 47, null]
    var bin = [];
    for (var i =0; i<arr.length; i++){
        if (arr[i] == (NaN || 0 || false || "" || undefined || null)){
            arr.splice(arr[i],1);
        }
    }
  console.log(arr); // Expected output [15, -22, 47]
}

5 个答案:

答案 0 :(得分:3)

代码中的问题:

  1. 将数组从最后一个元素迭代到第一个元素
  2. Array#splice期望第一个参数为索引,而不是项目本身
  3. 要检查元素是否为NaN,请使用isNaN()
  4. 要与多个值进行比较,请分别比较每个项目的元素
  5. 工作代码:

    &#13;
    &#13;
    function remove(arr) {
        for (var i = arr.length - 1; i >= 0; i--) {
            if (isNaN(arr[i]) || arr[i] === 0 || arr[i] === false || arr[i] === "" || arr[i] === undefined || arr[i] === null) {
    
            // Which is same as
            // if (!arr[i]) {
                arr.splice(i, 1);
            }
        }
    
        console.log(arr); // Expected output [15, -22, 47]
    }
    
    remove([NaN, 0, 15, false, -22, '', undefined, 47, null]);
    &#13;
    &#13;
    &#13;

    使用Array#filter

    arr = arr.filter(e => e);
    

    &#13;
    &#13;
    var input = [NaN, 0, 15, false, -22, '',undefined, 47, null];
    
    var filteredArr = input.filter(e => e);
    document.body.innerHTML = '<pre>' + JSON.stringify(filteredArr, 0, 4) + '</pre>';
    &#13;
    &#13;
    &#13;

    @dandavis

    中的comment所述
    arr = arr.filter(Boolean);
    

    &#13;
    &#13;
    var input = [NaN, 0, 15, false, -22, '',undefined, 47, null];
    
    var filteredArr = input.filter(Boolean);
    document.body.innerHTML = '<pre>' + JSON.stringify(filteredArr, 0, 4) + '</pre>';
    &#13;
    &#13;
    &#13;

答案 1 :(得分:2)

此解决方案可能效率不高

function filterArray(el) {
    return (typeof (el) === "number" && el != 0 && !isNaN(el));
}

arr = [NaN, 0, 15, false, -22, '', undefined, 47, null];
console.log(arr.filter(filterArray));

jsfiddle

答案 2 :(得分:2)

使用lodash

console.log(_.compact(arr));

答案 3 :(得分:1)

您指的是使用ingredients:Ember.computed('selectedRecipe', function(){ // do filtering stuff and return the result return this.get('customArray').filterBy('name',this.get('selectedRecipe')); }) ,因此我假设您需要一个就地(变异)解决方案。这是一个简单,快速的方法:

splice

如果您关心(并且您可能不应该),这比function compact(a) { var i = 0, j = 0; while (i < a.length) { var v = a[i++]; if (v) a[j++] = v; } a.length = j; } 上的循环快10倍。请参阅http://jsperf.com/compacting-an-array

如果你想要一个创建新阵列的解决方案,使用splice在其他答案中给出的替代方案很好,但这里是一个基本版本:

filter

答案 4 :(得分:0)

 function bouncer(arr) {
  var newArr=arr.slice(0);
  var n=0;
  for(var i=0; i<arr.length;i++){
    if(arr[i]==false||arr[i]==null||arr[i]==0||arr[i]==""||arr[i]==undefined||Number.isNaN(arr[i])==true){
      newArr.splice(n,1);

    } else n++;
  }
  console.log(newArr);
  return newArr;
}

bouncer([null, NaN, 1, 2, undefined,0,'a']);

我尝试用slice()做它。对于NaN,我使用了Number.isNaN()函数,如果返回true,则继续... 输入为[null,NaN,1、2,未定义,0,'a'],并按预期返回了[1、2,'a'] ...希望对您有所帮助