Photo by Vincent van Zalinge on Unsplash
引用自 MDN:

falsy(虚值)是在 Boolean 上下文中已认定可转换为‘假‘的值.JavaScript 在需要用到布尔类型值的上下文中使用强制类型转换(Type Conversion )将值转换为布尔值,比如:在条件语句或者循环语句中。falsy 有时写作 falsey

在 JavaScript 中有很多方法可以从数组中删除元素,但是从数组中删除所有虚值的最简单方法是什么?为了回答这个问题,我们将仔细研究 truthy 与 falsy 值和类型强制转换。


算法说明


从数组中删除所有虚值。JavaScript 中的虚值是  false、 null、 0、 ""、 undefined 和  NaN。提示:尝试将每个值转换为布尔值。
1function bouncer(arr) {2  return arr;3}45bouncer([7, "ate", "", false, 9]);

提供的测试用例


  • bouncer([7, "ate", "", false, 9]) 应该返回 [7, "ate", 9]。

  • bouncer(["a", "b", "c"]) 应该返回 ["a", "b", "c"]。

  • bouncer([false, null, 0, NaN, undefined, ""]) 应该返回 []。

  • bouncer([1, null, NaN, 2, undefined]) 应该返回 [1, 2]。

解决方案:.filter( ) 和 Boolean( )


理解问题:我们有一个作为输入的数组。目标是从数组中删除所有的虚值然后将其返回。

freeCodeCamp 上的好心人告诉我们,JavaScript 中的虚值是 false、 null、 0、 ""、 undefined 和 NaN。

他们也给了我们一个重要的提示!他们建议将数组的每个值转换为布尔值以完成此挑战。我认为这个提示很不错!

示例/测试用例:前面提供的测试用例告诉我们,如果输入数组只包含虚值,那么应该只返回一个空数组。这非常简单。

数据结构:在这里我们将坚持使用数组。

我们来谈谈.filter():

.filter()创建一个新数组,其中包含通过所提供函数测试的所有元素。

换句话说,.filter() 遍历数组中的每个元素并保留通过其中某个测试的所有元素。数组中未通过该测试的所有元素都被过滤掉了 —— 被删除了。

如果我们有一个数组并且只想保留大于 100 的数字,可以用 .filter() 来实现:

1let numbers = [4, 56, 78, 99, 101, 150, 299, 300]2numbers.filter(number => number > 100)3// returns [ 101, 150, 299, 300 ]

我们再来谈谈那个将每个元素转换为布尔值的提示。这是一个很好的提示,因为我们可以用 .filter() 返回只有真值(truthy)的数组。

我们将通过JavaScript类型转换来实现这一目标。

JavaScript 为我们提供了将一种数据类型转换为另一种的有用函数, String()转换为字符串,Number() 转换为数字,Boolean() 转换为布尔值。

例如:

1String(1234)2// returns "1234"3Number("47")4// returns 475Boolean("meow")6// returns true

Boolean() 是我们完成这个挑战所需要的函数。如果提供给 Boolean() 的参数是真值,那么 Boolean() 将返回 true 。如果提供给 Boolean() 的参数是虚值,那么 Boolean() 将返回 false。

这对我们非常有用,因为我们从指令中知道只有 false,null,0,"",undefined 和 NaN 在 JavaScript 中是虚值。其他每一个值都是真值。知道如果我们将输入数组中的每个值都转换为布尔值,就可以删除所有值为 false 的元素,这就满足了此挑战的要求。

算法:

1.确定 arr 中的哪些值是虚值。

2.删除所有虚值。

3.返回仅包含真值(truthy)的新数组。

代码:

 1function bouncer(arr) { 2  // Use filter to remove falsy elements from arr. 3  let onlyTruthyValues = arr.filter(element => Boolean(element) === true) 4  //                                7          Boolean(7) is true 5  //                                "ate"      Boolean("ate") is true 6  //                                ""         Boolean("") is false 7  //                                false      Boolean(false) is false 8  //                                9          Boolean(9) is true 910  // Return the new array.11  return onlyTruthyValues12  //     [7, "ate", 9]13}1415bouncer([7, "ate", "", false, 9]);

去掉注释并删除局部变量:

1function bouncer(arr) {2  return arr.filter(element => Boolean(element) === true)3}45bouncer([7, "ate", "", false, 9]);

如果你有其他解决方案或建议,请在评论中分享!


本文是该系列 freeCodeCamp Algorithm Scripting 的一部分。
本文引用了 freeCodeCamp Basic Algorithm Scripting:Falsy Bouncer。

©著作权归作者所有:来自51CTO博客作者mb5ff980b461ced的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Python 为什么能支持任意的真值判断?
  2. 怎样在JavaScript中创建和填充任意长度的数组 [每日前端夜话0x29
  3. 从简单到复杂,一文带你搞懂滑动窗口在数组及字符串中的应用
  4. 一文多图带你看看如何用「对撞指针」思想巧解数组题目
  5. 20张图!3个视频!一文带你搞定「快慢指针」在数组中的应用
  6. LeetCode #80 删除排序数组中的重复项II
  7. LeetCode #26 删除排序数组中的重复项
  8. 数据结构 #1 浅谈数组
  9. (美团)巧用数组下标,轻轻松松找出所有元素

随机推荐

  1. Java异常处理机制 —— 深入理解与开发应
  2. 如何使用Java Generics从String中撤回T
  3. JavaScript替换字符串中最后一个字符
  4. Unobtrusive Javascript有三层含义
  5. 转发可变数量的参数以通过椭圆运算符接受
  6. Java向PostgreSQL发送prepared statement
  7. 深入理解Java虚拟机读书笔记---垃圾回收
  8. 紧凑的方式来创建番石榴Multimaps?
  9. Java实用工具类
  10. 406春天mvc不能接受