如何在数组上使用 .filter() 仅删除 'NaN' 而不是字符串和数字?

How can I use .filter() on an array to remove only 'NaN' but not strings and numbers?

我尝试使用 isNaN(value)!isNaN(value) 但我无法在不删除字符串的情况下删除给定代码中的 NaN 元素。 (显然是因为字符串不是数字)。

function cleaner(arr) {
  return = arr.filter(function f(value) {return (value !== false && value !== null && value !== 0 && value !== undefined)});
}
cleaner([7, "eight", false, null, 0, undefined, NaN, 9, ""]);

以上代码应该return[7, "eight", 9, ""];

因为你想过滤掉所有虚假值除了空字符串,你只需要

function cleaner(arr) {
  return arr.filter(function(value) {
    return value === '' || value;
  });
}

如果您想过滤掉所有虚假值 包括 空字符串,您可以这样做:

function cleaner(arr) {
  return arr.filter(Boolean);
}

检测x是否为NaN的一些方法:

  • Number.isNaN(x) (ES6)
  • Object.is(x, NaN) (ES6)
  • x !== x
  • (typeof x === 'number') && isNaN(x)

注意:单独使用 isNaN 并不是检查值是否为 NaN!

的可靠方法

这将 return 只有数字(没有 0)和字符串(包括空字符串)。

function cleaner(arr) {
   return arr.filter(function(item){ 
      return typeof item == "string" || (typeof item == "number" && item);
              /** Any string**/        /** Numbers without NaN & 0 **/
   });
}
console.log(cleaner([7, "eight", false, null, 0, undefined, NaN, 9, ""]));
//[7, "eight", 9, ""]

使用 ES2015 Arrow Function 语法

array.filter(item => typeof item == "string" || (typeof item == "number" && item));

var filteredArr = [7, "eight", false, null, 0, undefined, NaN, 9, ""].filter(item => typeof item == "string" || (typeof item == "number" && !isNaN(item) && item));

console.log(filteredArr);