如何在数组 (JS) 中过滤掉 NaN、null、0、false

How to filter() out NaN, null, 0, false in an array (JS)

本文关键字:NaN null false 过滤 数组 JS      更新时间:2023-09-26

我被要求过滤掉数组中的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。无需使用循环在所有数组中进行迭代。

或者可以简单地解释编码的工作原理。[我试图在---清楚地解释它]

如果要求您过滤掉数组中的NaNnull0false,那么您的解决方案实际上不起作用。

您的意见:

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-0nullfalseNaNundefined或空字符串(""(,则对象的值为 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(( 方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。

由于 falsenull0""undefinedNaN 在 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;
}