如何在数组 (JS) 中过滤掉 NaN、null、0、false
How to filter() out NaN, null, 0, false in an array (JS)
我被要求过滤掉数组中的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] 等上是 alread。无需使用循环在所有数组中进行迭代。
或者可以简单地解释编码的工作原理。[我试图在---清楚地解释它]
如果要求您过滤掉数组中的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
构造函数也是一个函数,因此它为"真实"参数返回true
,为"虚假"参数返回false
。如果省略该值或0
、-0
、null
、false
、NaN
、undefined
或空字符串(""
(,则对象的值为 false。所有其他值(包括任何对象或字符串 "false"
(创建一个初始值为 true
的对象。
您也可以使用标识函数代替 Boolean
。
function bouncer(arr) {
return arr.filter(x => x);
}
我也在研究自由代码营地虚假保镖算法。 我发现最简单的方法是:
function bouncer(arr) {
return arr.filter(Boolean);
}
查看文档以了解Array.filter
。特别要注意回调的参数:
用于测试数组每个元素的函数。使用参数(元素、索引、数组(调用。返回 true 以保留元素,否则返回 false。
所以在你的情况下arr
是元素(而且名字不好,因此你感到困惑(。Filter 循环遍历您的数组,对于它调用的每个项目,回调将当前位置的元素作为 arr
传递。
正如其他人在评论中指出的那样,过滤器回调的逻辑对于负值实际上是有缺陷的,但如果您知道数组永远不会包含负值,这可能不是问题(但这可能是一件危险的事情假设(。
当然,在内部,这是遍历数组。如果不接触数组中的每个元素,就无法过滤(未排序的(数组。查看链接中的 polyfil 以了解它是如何工作的(可能是因为这是一个实现细节,可能与不同的 JavaScript 引擎不同,但无疑会涉及某处的循环(,它遍历你的数组,调用回调(注意参数(,如果回调返回 true,它会被推送到结果数组上。
filter(( 方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。
由于 false
、null
、0
、""
、undefined
和 NaN
在 JavaScript 中都是 Falsy 值,因此它们在测试时会返回 false。
function bouncer(arr) {
var array = arr.filter(function(val){
return val;
});
return array;
}
只有不返回 false 的值才会被添加到数组中。
假设所有不需要的元素在布尔预期时都转换为 false,不会更优雅,因此:
function clear (arr){
var stripped = [];
for (i = 0, len = arr.length; i < len; i++){
if (arr[i])
stripped.push(arr[i]);
}
return stripped;
}
用于测试数组每个元素的函数。使用参数调用 (元素、索引、数组(。返回 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"]
由于我是编码初学者,我的逻辑是使用原始布尔值来比较项目的过滤,但这是在我阅读布尔对象引用之前,你看到的是就像它写在那里一样,"如有必要,作为第一个参数传递的值将转换为布尔值。如果省略值或值为 0、-0、空值、假值、NaN、未定义或空字符串 ("(,则对象的初始值为 false。所有其他值(包括任何对象或字符串"false"(都会创建一个初始值为 true 的对象。所以逻辑 因为 filter 返回值,如果它是真还是假,你应该返回值,如果他们是真的。另外,我没有学到有关过滤方法的所有知识,对于我所研究的内容,我得到了更多的信息,我会尝试在这里解释。
重新定义方法(它已经存在,只是为了理解(Filter 方法接受一个名为谓词,即接收的函数一个值并返回 true 或 false。
var 结果是一个空数组,其中的结果将使用 push 方法推送。我们使用forEach方法,(this,在此上下文中应用于数组原型,这意味着您将在您定义的每个数组上都提供过滤器方法,与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]));
希望这有助于理解方法,首先不理解的是传递函数的部分,方法的谓词,如果我在这里有错误,请提出更正建议。
看起来布尔值是"FreeCodeCamp"挑战的最简单修复/答案,但是尝试几件事只是为了掌握"为什么"和"如何"的窍门可能会很有用。
function bouncer(arr) {
return arr.filter(function(val){
return val;
});
}
这会使用传入的函数(回调(评估通过过滤器的所有内容,该函数返回值。如果它不返回一个值,而 null 等不会返回,它将不会包含在返回中。至少这种方法帮助我理解了原因,而不仅仅是通过测试。
我稍微修改了 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]
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;
}
- 数组在递归方法中设置为null
- 字符串在将其传递给另一个活动Android JavaScript时读取Null
- 无法获取属性'selectedIndex'的未定义引用或null引用
- Meteor方法在客户端返回null,在客户端运行的相同方法返回正确的值
- 来自文本输入null的html javascript变量
- JavaScript NaN equvialence
- delete在Object上效率低下,但在DOM Element's的数据属性,与null out相比
- php代码在textbox更改事件上显示null
- 相同的RegExp返回不同的结果-第一次是正确的结果,第二次是null
- 在php中提交数据时,如果某些值为null,而某些值为非null,如何进行查询
- 未捕获的类型错误:无法读取属性'addEventListener'的null chrome扩展名
- 如何为排除无穷大和NaN的数字声明Flow类型
- 为什么我在这个javaScript代码中使用NaN
- 为什么localStorage[“..”]未定义,而localStorage.getItem(“..”)为null
- Map/Reduce给我NaN或错误的结果(由于null)
- jQuery NaN表单需要NULL属性
- 在匿名回调中使用函数参数将返回 null/NaN
- 比较未定义/null/NaN与ActionScript中的number
- ng-admin日期选择器过滤器初始化为null/NaN值
- 如何在数组 (JS) 中过滤掉 NaN、null、0、false