我被要求在数组中过滤掉 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']
但问题是我真的不知道我是如何得出答案的,或者我不知道它是如何运作的。特别是 arr> 0 过滤器是如何知道arr在arr [1],arr [2]等上已经被读取的而没有使用循环来迭代所有数组。
或者只是简单地解释如何编码工作。 [我试图清楚地解释清楚---]
答案 0 :(得分:72)
如果系统要求您过滤掉数组中的NaN
,null
,0
,false
,那么您的解决方案就无法正常运行。
您的输入:
bouncer([0, 1, 2, 3, 'ate', '', false, NaN]);
将获得输出:
[1, 2, 3, 'ate', NaN]
要过滤掉所有“虚假”值,您只需使用Boolean
:
function bouncer(arr) {
return arr.filter(Boolean);
}
bouncer([0, 1, 2, 3, 'ate', '', false, NaN]);
输出:
[1, 2, 3, 'ate']
由于Boolean
构造函数也是一个函数,它返回'{1}}表示'truthy'参数或true
表示'falsy'参数。如果值被省略,或者是false
,0
,-0
,null
,false
,NaN
或空字符串({{ 1}}),该对象的值为false。所有其他值(包括任何对象或字符串undefined
)都会创建一个初始值为""
的对象。
答案 1 :(得分:7)
您也可以使用身份功能代替Boolean
。
function bouncer(arr) {
return arr.filter(x => x);
}
答案 2 :(得分:4)
我也在研究Free Code Camp Falsy Bouncer算法。我发现最简单的方法是:
function bouncer(arr) {
return arr.filter(Boolean);
}
答案 3 :(得分:3)
查看Array.filter
的{{3}}。特别注意回调的参数:
测试数组中每个元素的函数。使用参数(元素,索引,数组)调用。返回true以保留元素,否则返回false。
所以在你的情况下arr
是元素(并且命名不佳,因此你的困惑)。过滤循环遍历您的数组,并为其调用的每个项目回调传递当前位置的元素arr
。
正如其他人在评论中指出的那样,过滤回调的逻辑实际上对于负值是有缺陷的,但如果你知道你的数组永远不会包含负值,那么这可能不是问题(但这可能是危险的要假设的事情。)
当然,在内部,这是循环遍历您的阵列。如果不触及数组中的每个元素,则无法过滤(未排序)数组。查看链接中的polyfil,了解它可能的工作原理(可能因为这是一个实现细节,可能因不同的javascript引擎而有所不同,但无疑会涉及某个循环),它循环遍历数组,调用回调(注意参数),如果回调返回true,则将其推送到结果数组。
答案 4 :(得分:2)
filter()方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。
由于false
,null
,0
,""
,undefined
和NaN
都是 Falsy 值因此,在JavaScript中,测试时它们将返回 false 。
function bouncer(arr) {
var array = arr.filter(function(val){
return val;
});
return array;
}
只有不返回false 的值才会添加到数组。
答案 5 :(得分:1)
在假设所有不需要的元素在布尔预期时被转换为false时,不会更优雅,所以:
function clear (arr){
var stripped = [];
for (i = 0, len = arr.length; i < len; i++){
if (arr[i])
stripped.push(arr[i]);
}
return stripped;
}
答案 6 :(得分:0)
测试数组中每个元素的函数。用参数调用 (元素,索引,数组)。返回true以保持元素,false 否则
如果你只想要解释。数组filter()
顾名思义。如果条件错误(错误),请删除不需要的元素。
(arr > 0|| isNaN(arr) === true
)
0, false || false //removed
1, true || false
2, true || false
3, true || false
'ate', false || true
'', false|| false // removed
false false || false //removed
输出:
[1, 2, 3, "ate"]
答案 7 :(得分:0)
由于我是编码的初学者,我的逻辑是使用原始布尔来比较项目的 过滤,但这是在我阅读布尔对象引用之前,你看到的是 就像它写在那里, “如果需要,作为第一个参数传递的值将转换为布尔值。如果省略值或者为0,-0,null,false,NaN,undefined或空字符串(”“),则对象具有初始值false。所有其他值,包括任何对象或字符串“false”,都会创建一个初始值为true的对象。“ 因此,如果过滤器返回值为true或false,则应该返回值if 他们是真的。 另外,我没有学习有关滤波器方法的所有内容,因为我已经研究过了 更多信息,我将在这里解释。'
重新定义方法(它已经存在,只是为了理解) filter方法接受一个名为的函数 谓词,即接收的函数 一个值并返回true或false。
var结果是一个空数组,其中结果将使用push方法推送。 我们使用forEach方法,(在此上下文中应用于数组原型,这意味着您将在您定义的每个数组上使用filter方法, array.method(args)的sintax就是这种情况下的array.filter(args)) 一些资源 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype
现在我们将使用forEach方法在数组的每个项目中运行一个操作,现在我们将谓词函数应用于数组的itch项目,如果它返回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]));
希望这有助于理解,方法,以及不理解的第一件事是传递函数的部分,谓词的方法,如果我在这里有错误,请建议更正。
答案 8 :(得分:0)
看起来布尔是“FreeCodeCamp”挑战最简单的修复/答案,但尝试一些事情只是为了得到“为什么”和“如何”的悬念可能是有用的。
function bouncer(arr) {
return arr.filter(function(val){
return val;
});
}
这将使用传入的函数(回调)计算通过过滤器的所有内容,该函数返回值。如果它没有返回一个值,null等不会返回,它将不包含在返回值中。至少这种方法帮助我理解了为什么而不仅仅是通过测试。
答案 9 :(得分:0)
我对https://stackoverflow.com/a/35327425/3932895进行了一些修改,将所有没有数值的值都设置为零
function zerofy(x){return (Boolean(x) && !isNaN(x.toString())) ? x : 0 ;}
经过测试
function clear (arr){
var stripped = [];
for (i = 0; i < arr.length; i++){
stripped.push(zerofy(arr[i]));
}
return stripped;
}
在
clear(["written",13,0,-4,"5",true,false,undefined,null,NaN,Math.PI]);
结果
[0,13,0,-4,5,0,0,0,0,0,3.141592653589793]
答案 10 :(得分:-3)
function bouncer(arr) {
// Don't show a false ID to this bouncer.
function isFalsyBouncer(value){
if(Boolean(false)||Boolean(null)||Boolean(0)||Boolean("")||Boolean(undefined)||Boolean(NaN)){
}else{
return value;
}
}
var filtered=arr.filter(isFalsyBouncer);
return filtered;
}