Ginson
V2EX  ›  JavaScript

请教 freecodecamp 一道题目,筛选数组真假值问题

By Ginson at 2020 年 2 月 9 日 · 3588 次点击

近期通过做 freecodecamp 题目学习 JS,今天发现一个真假值的问题,请大家指点一下。

题目是,给定一个数组,如 [7, "ate", "", false, 9],让你定义一个函数,将数组中的真值筛选出来,并以数组形式返回

我的解法,循环判断值,如不为真则将该值从数组中删除

function bouncer1(arr) {
  for(let i=0;i<arr.length;i++){
    if(!arr[i]) arr.splice(arr.indexOf(arr[i]), 1);
  }
  return arr;
}
bouncer1([7, "ate", "", false, 9]);

运行结果是 [7, "ate", false, 9],false 不知为何没有过滤掉

我觉得问题可能在 !arr[i] 或者 arr.indexOf(arr[i]) 上,但我尝试了一下发现这两处运行的结果都是符合预期的,不知问题到底在哪

10 条回复  •  2020-03-04 11:12:04 +08:00
rabbbit
   1
rabbbit  
   2020 年 2 月 9 日
for(let i=0;i<arr.length;i++){
-->
for(let i=arr.length - 1;i>=0;i--){
rabbbit
   2
rabbbit  
   2020 年 2 月 9 日
涉及到遍历 + 删除 数组的操作,尽量倒着遍历
optional
   3
optional  
   2020 年 2 月 9 日
for array 最好不要新增或者删除元素,这是 bug 的发源地之一。
这里用 filter 就好
ericgui
   4
ericgui  
   2020 年 2 月 9 日
为什么不弄一个新数据,把真值往里面 push ?
Ginson
   5
Ginson  
OP
   2020 年 2 月 9 日
@ericgui 嗯,标准答案就是新建一个数组往里塞
但是我这里比较疑惑的就是为什么改原数组不行
Ginson
   6
Ginson  
OP
   2020 年 2 月 9 日
@rabbbit
@optional
所以问题在于 [遍历的同时增删元素,会影响数组长度,从而影响遍历过程] ?
感谢,大致清楚了
xAI
   7
xAI  
   2020 年 2 月 9 日
if(!arr[i]) delete arr[i]; 不可以吗?
Ginson
   8
Ginson  
OP
   2020 年 2 月 9 日
@jun0205 你可以试下,delete 虽然会删除值,但是会留一个 undefine 在那里
freeCodeCamp
   9
freeCodeCamp  
   2020 年 2 月 28 日
for 循环的时候,i 一直在自增,每次删除一个假值,数组长度减 1,"" 和 false 相邻,直接跳过了 false 的判断。

BTW,我们正在将中文课程翻译上线到 freeCodeCamp 官方网站,记得关注哟~
Ginson
   10
Ginson  
OP
   2020 年 3 月 4 日
@freeCodeCamp 辛苦了!赞美 fcc !
推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
© 2026 V2EX · 30ms · 3.9.8.5