如何在数组(JS)中过滤()输出NaN,null,0,false

时间:2015-08-10 17:07:38

标签: javascript arrays filter boolean nan

我被要求在数组中过滤掉 NaN,null,0,false

幸运的是我回答了这个问题。

function bouncer(arr) {
  function filterer(arr) {
     return arr > 0|| isNaN(arr) === true;
  }
  arr = arr.filter(filterer);
  return arr;
}

//example input
bouncer([0, 1, 2, 3, 'ate', '', false]); //output [1, 2, 3, 'ate']

但问题是我真的不知道我是如何得出答案的,或者我不知道它是如何运作的。特别是 arr> 0 过滤器是如何知道arr在arr [1],arr [2]等上已经被读取的而没有使用循环来迭代所有数组。

或者只是简单地解释如何编码工作。 [我试图清楚地解释清楚---]

11 个答案:

答案 0 :(得分:72)

如果系统要求您过滤掉数组中的NaNnull0false,那么您的解决方案就无法正常运行。

您的输入:

bouncer([0, 1, 2, 3, 'ate', '', false, NaN]);

将获得输出:

[1, 2, 3, 'ate', NaN]

要过滤掉所有“虚假”值,您只需使用Boolean

function bouncer(arr) {
  return arr.filter(Boolean);
}

bouncer([0, 1, 2, 3, 'ate', '', false, NaN]);

输出:

[1, 2, 3, 'ate']

由于Boolean构造函数也是一个函数,它返回'{1}}表示'truthy'参数或true表示'falsy'参数。如果值被省略,或者是false0-0nullfalseNaN或空字符串({{ 1}}),该对象的值为false。所有其他值(包括任何对象或字符串undefined)都会创建一个初始值为""的对象。

答案 1 :(得分:7)

您也可以使用身份功能代替Boolean

function bouncer(arr) {
  return arr.filter(x => x);
}

答案 2 :(得分:4)

我也在研究Free Code Camp Falsy Bouncer算法。我发现最简单的方法是:

function bouncer(arr) {
   return arr.filter(Boolean);
}

答案 3 :(得分:3)

查看Array.filter的{​​{3}}。特别注意回调的参数:

  

测试数组中每个元素的函数。使用参数(元素,索引,数组)调用。返回true以保留元素,否则返回false。

所以在你的情况下arr是元素(并且命名不佳,因此你的困惑)。过滤循环遍历您的数组,并为其调用的每个项目回调传递当前位置的元素arr

正如其他人在评论中指出的那样,过滤回调的逻辑实际上对于负值是有缺陷的,但如果你知道你的数组永远不会包含负值,那么这可能不是问题(但这可能是危险的要假设的事情。)

当然,在内部,这是循环遍历您的阵列。如果不触及数组中的每个元素,则无法过滤(未排序)数组。查看链接中的polyfil,了解它可能的工作原理(可能因为这是一个实现细节,可能因不同的javascript引擎而有所不同,但无疑会涉及某个循环),它循环遍历数组,调用回调(注意参数),如果回调返回true,则将其推送到结果数组。

答案 4 :(得分:2)

  

filter()方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。

由于falsenull0""undefinedNaN都是 Falsy 值因此,在JavaScript中,测试时它们将返回 false

function bouncer(arr) {
  var array = arr.filter(function(val){
    return val;
  });
  return array;
}

只有不返回false 的值才会添加到数组

答案 5 :(得分:1)

在假设所有不需要的元素在布尔预期时被转换为false时,不会更优雅,所以:

function clear (arr){
   var stripped = [];
   for (i = 0, len = arr.length; i < len; i++){
      if (arr[i])
         stripped.push(arr[i]);
   }
   return stripped;
}

答案 6 :(得分:0)

  

测试数组中每个元素的函数。用参数调用   (元素,索引,数组)。返回true以保持元素,false   否则

如果你只想要解释。数组filter()顾名思义。如果条件错误(错误),请删除不需要的元素。

arr > 0|| isNaN(arr) === true

0,  false || false  //removed
1,  true || false  
2,  true || false
3,  true || false
'ate', false || true
'',   false|| false  // removed
false  false || false //removed

输出:

[1, 2, 3, "ate"]

答案 7 :(得分:0)

由于我是编码的初学者,我的逻辑是使用原始布尔来比较项目的 过滤,但这是在我阅读布尔对象引用之前,你看到的是 就像它写在那里, “如果需要,作为第一个参数传递的值将转换为布尔值。如果省略值或者为0,-0,null,false,NaN,undefined或空字符串(”“),则对象具有初始值false。所有其他值,包括任何对象或字符串“false”,都会创建一个初始值为true的对象。“ 因此,如果过滤器返回值为true或false,则应该返回值if 他们是真的。 另外,我没有学习有关滤波器方法的所有内容,因为我已经研究过了 更多信息,我将在这里解释。'

重新定义方法(它已经存在,只是为了理解) filter方法接受一个名为的函数 谓词,即接收的函数 一个值并返回true或false。

var结果是一个空数组,其中结果将使用push方法推送。 我们使用forEach方法,(在此上下文中应用于数组原型,这意味着您将在您定义的每个数组上使用filter方法, array.method(args)的sintax就是这种情况下的array.filter(args)) 一些资源 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

现在我们将使用forEach方法在数组的每个项目中运行一个操作,现在我们将谓词函数应用于数组的itch项目,如果它返回true,则将其添加到结果中。

Array.prototype.filter = function(predicate){   
    var results = [];

    this.forEach(function(item) {   
        if (predicate(item)) {
            results.push(item);
        }

    });
};

// -------------------------------正确解决方案------------ ---------------

function bouncer (arrToFilter){

    return arrToFilter.filter(Boolean);
}

// ----------没有过滤方法的代码---------

function bouncerNoFilterMethod(arrToFilter){
    var results = [];

    arrToFilter.forEach(function(arrToFilter){
        if(arrToFilter){
            results.push(arrToFilter);
        }
    });

    return  results;    
}

console.log(bouncerNoFilterMethod([7, "ate", "", false, 9]));
console.log(bouncerNoFilterMethod(["a", "b", "c"]));
console.log(bouncerNoFilterMethod([false, null, 0, NaN, undefined, ""]));
console.log(bouncerNoFilterMethod([1, null, NaN, 2, undefined]));
console.log(bouncer([7, "ate", "", false, 9]));
console.log(bouncer(["a", "b", "c"]));
console.log(bouncer([false, null, 0, NaN, undefined, ""]));
console.log(bouncer([1, null, NaN, 2, undefined]));

希望这有助于理解,方法,以及不理解的第一件事是传递函数的部分,谓词的方法,如果我在这里有错误,请建议更正。

答案 8 :(得分:0)

看起来布尔是“FreeCodeCamp”挑战最简单的修复/答案,但尝试一些事情只是为了得到“为什么”和“如何”的悬念可能是有用的。

function bouncer(arr) {
      return arr.filter(function(val){
        return val;
     });
    }

这将使用传入的函数(回调)计算通过过滤器的所有内容,该函数返回值。如果它没有返回一个值,null等不会返回,它将不包含在返回值中。至少这种方法帮助我理解了为什么而不仅仅是通过测试。

答案 9 :(得分:0)

我对https://stackoverflow.com/a/35327425/3932895进行了一些修改,将所有没有数值的值都设置为零

function zerofy(x){return (Boolean(x) && !isNaN(x.toString())) ? x : 0 ;}

经过测试

function clear (arr){
   var stripped = [];
   for (i = 0; i < arr.length; i++){
      stripped.push(zerofy(arr[i]));
   }
   return stripped;
}

clear(["written",13,0,-4,"5",true,false,undefined,null,NaN,Math.PI]);

结果

[0,13,0,-4,5,0,0,0,0,0,3.141592653589793]

答案 10 :(得分:-3)

function bouncer(arr) {
  // Don't show a false ID to this bouncer.

  function isFalsyBouncer(value){
    if(Boolean(false)||Boolean(null)||Boolean(0)||Boolean("")||Boolean(undefined)||Boolean(NaN)){

    }else{
      return value;
    }
  }
  var filtered=arr.filter(isFalsyBouncer);
  return filtered;
}