从数组中删除所有有价值的值

Vig*_*esh 57 javascript arrays

我想从数组中删除所有的虚假值.JavaScript中的Falsy值为false,null,0,"",undefined和NaN.

function bouncer(arr) {
 arr = arr.filter(function (n) { 
    return (n !== undefined && n !== null && n !== false && n !== 0 && n !== "" && isNaN()!=NaN); });
  return arr;
}

bouncer([7, "ate", "", false, 9, NaN], "");
Run Code Online (Sandbox Code Playgroud)

除NaN测试用例外,以上所有人都满意.有人可以帮我检查数组是否包含NaN吗?

Lor*_*sum 121

你可以使用布尔值:

var myFilterArray = myArray.filter(Boolean);
Run Code Online (Sandbox Code Playgroud)

  • 布尔值是布尔的构造函数.这相当于`var myFilterArray = myArray.filter((v)=> new Boolean(v));`.如果给定值为"0"," - 0"(我知道......),"null","false","NaN","undefined"或空字符串,则生成的布尔值为"false". .如果还有其他任何东西,它将是"真实的". (10认同)
  • 那是一个聪明的人 (6认同)
  • 为什么这样做?我不知道。 (3认同)
  • @LoremIpsum:如果你尝试这样做,你会发现它永远不会过滤掉任何东西,因为用作 *constructor* 的 `Boolean` 创建了布尔包装对象(JavaScript 最愚蠢的功能,根本没有任何用途),它们总是真实的。`Boolean(v)` 而不是 `new Boolean(v)`,这是直接传递 `Boolean` 实现的,转换为 boolean。 (3认同)
  • @LoremIpsum 相当于 `var myFilterArray = myArray.filter((v) => Boolean(v));`,没有 `new`。`new Boolean` 将创建真实的布尔对象,这意味着 `filter` 接受所有元素,这又相当于 `var myFilterArray = myArray.filter(() => true);`。 (2认同)

Poi*_*nty 53

既然你想摆脱"虚假"的价值观,那就让JavaScript做点儿吧:

function bouncer(arr) {
  return arr.filter(function(v) { return !!v; });
}
Run Code Online (Sandbox Code Playgroud)

!运算符的双重应用 将使true值为"truthy"并且false当它为"falsy" 时返回过滤器回调.

(你的代码正在调用isNaN()但没有传递给它一个值;这就是为什么那个测试对你不起作用.如果它的参数被强制转换为数字,则该isNaN()函数返回,否则.)trueNaNfalse

编辑 - 请注意

function bouncer(arr) {
  return arr.filter(Boolean);
}
Run Code Online (Sandbox Code Playgroud)

LoremIpsum会在另一个答案中注意到,因为内置的布尔构造函数几乎完全相同!!.

  • 不是这个{return !! v; 与{return v;相同 } (5认同)
  • 从技术上讲,您甚至不需要在这里使用!!,因为“ filter”正在测试真实性,而不是与“ true”进行比较。 (2认同)

J__*_*J__ 22

truthyArray = arr.filter(el => el)
Run Code Online (Sandbox Code Playgroud)

你就是这样做的

  • 花括号禁用隐式返回,所以你将获得空数组. (3认同)

ion*_*ure 9

isNaN()以错误的方式使用.应该是这样的事情:

function bouncer(arr) {
   return arr.filter(function (n) { 
       return n !== undefined && n !== null && n !== false && n !== 0 && n !== "" && !isNaN(n); 
   });
Run Code Online (Sandbox Code Playgroud)

}

你也可以重写它:

function bouncer( arr ){
    return arr.filter( function( value ){
        return value;
    });
}
Run Code Online (Sandbox Code Playgroud)


sea*_*cal 5

这是另一个等效但说明性的解决方案:

function bouncer( arr ){
    return arr.filter( function( value ){
        return value ? true : false;
    });
}
Run Code Online (Sandbox Code Playgroud)

此代码示例具有说明性,因为它向读者指示变量value将被评估为 true 或 falsey,并且匿名函数将返回一个布尔值,或者truefalse,映射到 的评估value

对于不熟悉这种根据真实性从数组中删除值的方法的人,或者对于不熟悉(或尚未阅读相关文档)该函数的人来说filter,这个示例是最简洁的,仍然传达了函数的行为filter

当然,在您的应用程序中,您可以选择更简洁但缺乏洞察力的实现:

function bouncer( arr ){
    return arr.filter( function( value ){
        return value;
    });
}
Run Code Online (Sandbox Code Playgroud)


Ksh*_*tij 5

使用过滤器我们可以写

function bouncer(arr) {
 return arr.filter(item => item);
}
bouncer([false, null, 0, NaN, undefined, ""]) // will return [].
Run Code Online (Sandbox Code Playgroud)


And*_*ión 5

使用这个简单的过滤器可以做到:

array.filter(Boolean)

您可以在此处了解更多信息Boolean

  • 简单且最佳的解决方案! (2认同)