Javascript 我使用过滤器对吗?我不知道';我不知道这个解决方案为什么有效
我现在正在学习FCC的基本算法,虽然我通过了这个练习,但我并不完全理解它为什么会起作用,因为当我把事情改成我认为应该的样子时,它就不起作用了,但是当我改变事情,使它们看起来不对时,它仍然起作用 例如,我将Javascript 我使用过滤器对吗?我不知道';我不知道这个解决方案为什么有效,javascript,filter,Javascript,Filter,我现在正在学习FCC的基本算法,虽然我通过了这个练习,但我并不完全理解它为什么会起作用,因为当我把事情改成我认为应该的样子时,它就不起作用了,但是当我改变事情,使它们看起来不对时,它仍然起作用 例如,我将true更改为false,它仍然有效,或者我只是键入true,它仍然有效,或者我只是说返回值,它仍然有效。过滤器是否自动删除错误值 这是我的密码。我原来不起作用的代码是if(value==true) 从数组中删除所有虚假值 JavaScript中的Falsy值为false、null、0、“、未定
true
更改为false
,它仍然有效,或者我只是键入true,它仍然有效,或者我只是说返回值
,它仍然有效。过滤器是否自动删除错误值
这是我的密码。我原来不起作用的代码是if(value==true)
从数组中删除所有虚假值
JavaScript中的Falsy值为false、null、0、“、未定义和NaN
更新
谢谢你的回答,它们都非常有助于消除我的困惑
function bouncer(arr) {
let x = arr.filter(ages => {
return ages;
})
return(x);
}
bouncer([7, "ate", "", false, 9]);
这就是我最后重新编写的解决方案,现在我明白了为什么我要这么做。
filter
在数组中迭代。在每个元素迭代中调用回调
如果您在回调中返回一个“truthy”值,那么该元素将保留在结果数组中,否则不会
您的困惑源于这样一个事实,即您认为需要以某种方式返回值
参数您不需要
看看这个例子:
var动物=['dog','dog','cat','cat']
变量猫=动物。过滤器(值=>{
如果(值=='cat'){
返回真值
}否则{
返回错误
}
})
console.log(cats)
filter
在数组中迭代。在每个元素迭代中调用回调
如果您在回调中返回一个“truthy”值,那么该元素将保留在结果数组中,否则不会
您的困惑源于这样一个事实,即您认为需要以某种方式返回值
参数您不需要
看看这个例子:
var动物=['dog','dog','cat','cat']
变量猫=动物。过滤器(值=>{
如果(值=='cat'){
返回真值
}否则{
返回错误
}
})
console.log(猫)
您的回调
if (value !== true)
return value;
相当于
return value;
在您的情况下,因为数组中没有一个元素是true
,所以value!==true
始终有效
如果你把它改成
if (value !== false)
return value;
if (value === true)
return value;
它仍然执行返回值代码>用于大多数数组元素。唯一的异常是false
,对于该异常,函数返回undefined
(因为没有执行显式的return
语句)undefined
是falsy,因此它被filter
视为与return false
相同(因为filter
只关心回调返回的是true还是falsy值)。因此,如果元素为false,则最终不返回值与返回值
相同
function bouncer(arr) {
let x = arr.filter(value => {
if (value !== true)
return value;
})
console.log(x);
return x;
}
bouncer([7, "ate", "", false, 9]);
另一方面,如果您将其更改为
if (value !== false)
return value;
if (value === true)
return value;
如果当前元素为true
,则回调将返回true
,对于任何其他值,回调将返回undefined
。净效果是删除所有非true
的元素(在您的情况下是所有元素,因为您的输入数组不包含true
)
如果您想删除错误的值,您可以简单地说
arr.filter(value => { return value; })
// or:
arr.filter(value => value)
因为您使用的是值本身作为条件:任何看起来虚假的内容都会被过滤器删除;任何看起来真实的东西都会保留下来
如果您发现这一点令人困惑,也许可以通过查看此自定义(和简化的)过滤器
实现来澄清问题:
功能我的过滤器(arr,fn){
var结果=[];
对于(变量i=0;ivalue))代码>您的回调
if (value !== true)
return value;
相当于
return value;
在您的情况下,因为数组中没有一个元素是true
,所以value!==true
始终有效
如果你把它改成
if (value !== false)
return value;
if (value === true)
return value;
它仍然执行返回值代码>用于大多数数组元素。唯一的异常是false
,对于该异常,函数返回undefined
(因为没有执行显式的return
语句)undefined
是falsy,因此它被filter
视为与return false
相同(因为filter
只关心回调返回的是true还是falsy值)。因此,如果元素为false,则最终不返回值与返回值
相同
function bouncer(arr) {
let x = arr.filter(value => {
if (value !== true)
return value;
})
console.log(x);
return x;
}
bouncer([7, "ate", "", false, 9]);
另一方面,如果您将其更改为
if (value !== false)
return value;
if (value === true)
return value;
如果当前元素为true
,则回调将返回true
,对于任何其他值,回调将返回undefined
。净效果是删除所有非true
的元素(在您的情况下是所有元素,因为您的输入数组不包含true
)
如果您想删除错误的值,您可以简单地说
arr.filter(value => { return value; })
// or:
arr.filter(value => value)
因为您使用的是值本身作为条件:任何看起来虚假的内容都会被过滤器删除;任何看起来真实的东西都会保留下来
如果您发现这一点令人困惑,也许可以通过查看此自定义(和简化的)过滤器
实现来澄清问题:
功能我的过滤器(arr,fn){
var结果=[];
对于(变量i=0;i log(my_过滤器([7,“ate”,“false,9],value=>value))代码>如果您的目的是返回仅保留truthy值的数组,请执行以下操作:
.filter(Boolean)
在对过滤器的回调中,并不总是返回值,如果不返回,这意味着