我现在正在通过FCC基本算法,虽然我通过了练习,但我还没有完全理解它为什么会起作用,因为当我改变我认为它们应该是它不起作用的时候,但当我改变时所以他们看起来错了我仍然有效 .
例如,我将 true
更改为 false
,它仍然有效,或者我只是输入true,它仍然有效,或者我只是说 return value
,它可以工作 . 过滤器会自动删除虚假值吗?
这是我的代码 . 我的原始代码无法正常工作 if (value === true)
.
function bouncer(arr) {
let x = arr.filter(value => {
if (value !== true)
return value;
})
console.log(x);
return x;
}
bouncer([7, "ate", "", false, 9]);
从数组中删除所有有 Value 的值 .
JavaScript中的Falsy值为false,null,0,“”,undefined和NaN .
UPDATE
感谢所有答案,他们都非常有助于消除我的困惑 .
function bouncer(arr) {
let x = arr.filter(ages => {
return ages;
})
return(x);
}
bouncer([7, "ate", "", false, 9]);
这是我最终重写的解决方案,现在明白为什么我做了我做的事情 .
3 回答
filter
遍历您的数组 . 在每个元素迭代中,调用回调 .如果在回调中返回一个“truthy”值,那么元素将保留在结果数组中,否则不会 .
您的困惑源于您认为需要以某种方式返回
value
参数的事实 . You don't .看看这个例子:
当然,上面的内容可以简化为:
就是这样 .
你的回调,
等同于
在你的情况下,因为你的数组中没有元素是
true
,所以value !== true
总是成立 .如果你改成它
它仍然为大多数数组元素执行
return value;
. 唯一的例外是false
,您的函数返回undefined
(因为没有执行明确的return
语句) .undefined
是假的,所以它被return false
视为return false
(因为filter
只关心回调是否返回了真值或假值) . 因此,如果元素是false
,则最终不返回值,与return value
相同 .另一方面,如果您将其更改为
那么如果当前元素为
true
,则回调将返回true
,并返回undefined
以获取任何其他值 . 净效果是删除所有不是true
的元素(在您的情况下是所有元素,因为您的输入数组不包含true
) .如果你想删除虚假值,你可以简单地说
因为你正在使用值本身作为条件:任何看似虚假的东西都被
filter
删除;保留任何看似真实的东西 .如果你发现这个令人困惑,也许看看这个自定义(和简化)
filter
实现清除了一些事情:如果您的目的是返回仅保留truthy值的数组,那么执行以下操作:
在回调
filter
时,你不要't always return a value, and if you don' t,这意味着不会保留相应的值 . 此外,对于像!==
和===
这样的运营商,您正在进行严格的比较 . 所以value === true
只会匹配true
,而不是任何其他真正的 Value . 同样,value !== true
仍将匹配一些真正的值(不是true
) .