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.
您也可以使用身份功能代替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)
查看的文档Array.filter。特别注意回调的参数:
测试数组每个元素的函数。使用参数(元素、索引、数组)调用。返回 true 以保留元素,否则返回 false。
所以在你的情况下arr是元素(并且命名不好,因此你感到困惑)。Filter 循环遍历您的数组,并且对于它调用的每个项目,您都将回调传入当前位置的元素作为arr.
正如其他人在评论中指出的那样,您的过滤器回调的逻辑实际上对于负值是有缺陷的,但是如果您知道您的数组永远不会包含负值,那么这可能不是问题(但这可能是一件危险的事情) )。
当然,在内部,这会循环遍历您的数组。如果不接触数组中的每个元素,就无法过滤(未排序的)数组。查看链接中的 polyfil 以了解它是如何工作的(可能是因为这是一个实现细节,可能因不同的 javascript 引擎而异,但无疑会在某个地方涉及循环),它循环遍历您的数组,调用回调(注意参数),如果回调返回 true,它将被推送到结果数组中。