由于我是编程的初学者,我的逻辑是使用原始布尔值来比较筛选出的项目,但这是在我阅读布尔对象参考文献之前,你会发现就像它写在那里的那样,
“如果必要,将传递作为第一个参数的值转换为布尔值。如果省略值或为0、-0、null、false、NaN、undefined或空字符串(“”),则对象具有初始值false。所有其他值,包括任何对象或字符串“false”,都创建具有初始值true的对象。”
因此,逻辑上,由于过滤器返回值是否为true或false,您应该在它们为true时返回值。
此外,我还没有完全了解筛选方法,根据我的研究,我得到了更多的信息,我将在这里尝试解释。
重新定义方法(它已经存在,只是为了理解)
筛选方法接受一个称为谓词的函数,它是一个接收值并返回true或false的函数。
变量results是一个空数组,结果将使用push方法推送到其中。
然后我们使用forEach方法,这里的this应用于数组原型,这意味着您可以在定义的每个数组上使用filter方法,语法为array.method(args),在本例中为array.filter(args)。
一些资源
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype
现在,我们将对数组中的每个项运行操作,并使用forEach方法将谓词函数应用于数组的每个项,如果返回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]));
希望这能帮助理解方法,最初不理解的是将函数谓词传递给方法的部分,如果我有错误,请建议更正。
-1
这样的值会失败... 请尝试使用arr.filter(function(item) {return !!item;})
。 - Niet the Dark Absol[0, 1, 2, 3, 'ate', '', false].filter(Boolean)
? - Paul S.isNaN
,那么 @MattBurland 的ate
也将被删除,输出将为[1, 2, 3]
。 - Manwal