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

Fhr*_*rey 11 javascript arrays boolean nan filter

我被要求在数组中过滤掉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']
Run Code Online (Sandbox Code Playgroud)

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

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

小智 73

如果你被要求过滤掉NaN,null,0,false在一个数组,那么您的解决方案并没有真正发挥作用.

您的输入:

bouncer([0, 1, 2, 3, 'ate', '', false, NaN]);
Run Code Online (Sandbox Code Playgroud)

将获得输出:

[1, 2, 3, 'ate', NaN]
Run Code Online (Sandbox Code Playgroud)

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

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

bouncer([0, 1, 2, 3, 'ate', '', false, NaN]);
Run Code Online (Sandbox Code Playgroud)

输出:

[1, 2, 3, 'ate']
Run Code Online (Sandbox Code Playgroud)

由于Boolean构造函数也是一个函数,它返回true'truthy'参数或false'falsy'参数.如果省略了值或是0,-0,null,false,NaN,undefined,或空字符串(""),该对象具有的假值.所有其他值(包括任何对象或字符串"false")都会创建一个初始值为的对象true.


Tre*_*xon 9

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

function bouncer(arr) {
  return arr.filter(x => x);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

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

function bouncer(arr) {
   return arr.filter(Boolean);
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*and 5

查看的文档Array.filter。特别注意回调的参数:

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

所以在你的情况下arr是元素(并且命名不好,因此你感到困惑)。Filter 循环遍历您的数组,并且对于它调用的每个项目,您都将回调传入当前位置的元素作为arr.

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

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