-
Notifications
You must be signed in to change notification settings - Fork 1.4k
falsy bouncer
S1ngS1ng edited this page Mar 23, 2017
·
1 revision
- 这个
function一个数组参数arr,即为需要过滤的原数组。返回值为过滤假值后的数组 - 比如接收的是
["a", 7, false],那么输出就是["a", 7]。如果接收的是["a", "b", 7],那么输出应该还是["a", "b", 7] - 大体上这道题有两个思路。如果你知道数组的
filter方法,那么可以直接用这个方法去写。如果你不知道,那么用循环写也是没问题的 - 在 JavaScript 中,只有以下这几个会被认为是假值 (falsy):
false,null, 0,"",undefined,NaN。我们可以直接通过Boolean()构造器来得出元素究竟是不是假值
- 对于基本解法,我们先不用数组内建方法,只通过最基本的循环来实现,因此,你只需要知道
for循环和push就够了 - Array.push()
- Boolean()
function bouncer(arr) {
// 用于存储结果
var result = [];
for (var i = 0; i < arr.length; i++) {
if (Boolean(arr[i])) {
// 如果 Boolean 构造器返回 true,就保存到 result 中
result.push(arr[i]);
}
}
return result;
}- 这样写,应该思路很明确。遍历传入的
arr,一个一个判断就好 - 其实
Boolean(arr[i])也可以写成!!arr[i]。我们都知道,!是逻辑非,这里涉及到隐式类型转换,输出一定是一个Boolean,但是只用!操作一次,是得到相反的结果 - 因此,我们需要
!!来操作两次,这样,如果arr[i]是falsy那就会返回false。否则返回true
function bouncer(arr) {
return arr.filter(function (e) {
return !!e;
})
}- 只要你熟悉
filter方法的参数,就能理解这个写法了。e是一个形式参数,代表每一个元素 - 回调函数返回
true或者false,如果是true就保留,否则就删去
function bouncer(arr) {
return arr.filter(Boolean);
}- 由于
filter接受的参数是一个函数,这个函数的返回值需要为true或者false - 而
Boolean只接受一个参数,返回值就是true或者false - 在
filter的回调函数中,第一个参数即为每一个元素。而Boolean也只能接受一个参数,因此,才有了上面的写法