近期通过做 freecodecamp 题目学习 JS,今天发现一个真假值的问题,请大家指点一下。
题目是,给定一个数组,如 [7,"ate","",false,9],让你定义一个函数,将数组中的真值筛选出来,并以数组形式返回
我的解法,循环判断值,如不为真则将该值从数组中删除
functionbouncer1(arr){ for(leti=0;i<arr.length;i++){ if(!arr[i])arr.splice(arr.indexOf(arr[i]),1); } returnarr; } bouncer1([7,"ate","",false,9]);
运行结果是 [7, "ate", false, 9],false 不知为何没有过滤掉
我觉得问题可能在 !arr[i] 或者 arr.indexOf(arr[i]) 上,但我尝试了一下发现这两处运行的结果都是符合预期的,不知问题到底在哪
![]() | 1 rabbbit 2020-02-09 14:14:54 +08:00 for(let i=0;i<arr.length;i++){ --> for(let i=arr.length - 1;i>=0;i--){ |
![]() | 2 rabbbit 2020-02-09 14:16:23 +08:00 涉及到遍历 + 删除 数组的操作,尽量倒着遍历 |
3 optional 2020-02-09 14:20:13 +08:00 for array 最好不要新增或者删除元素,这是 bug 的发源地之一。 这里用 filter 就好 |
![]() | 4 ericgui 2020-02-09 14:27:33 +08:00 为什么不弄一个新数据,把真值往里面 push ? |
![]() | 6 Ginson OP |
![]() | 7 xAI 2020-02-09 19:55:44 +08:00 if(!arr[i]) delete arr[i]; 不可以吗? |
![]() | 9 freeCodeCamp 2020-02-28 15:55:28 +08:00 for 循环的时候,i 一直在自增,每次删除一个假值,数组长度减 1,"" 和 false 相邻,直接跳过了 false 的判断。 BTW,我们正在将中文课程翻译上线到 freeCodeCamp 官方网站,记得关注哟~ |
![]() | 10 Ginson OP @freeCodeCamp 辛苦了!赞美 fcc ! |