V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
Ginson
V2EX  ›  JavaScript

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

  •  
  •   Ginson · 2020-02-09 14:11:00 +08:00 · 2290 次点击
    这是一个创建于 1747 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    BTW,我们正在将中文课程翻译上线到 freeCodeCamp 官方网站,记得关注哟~
    Ginson
        10
    Ginson  
    OP
       2020-03-04 11:12:04 +08:00
    @freeCodeCamp 辛苦了!赞美 fcc !
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4857 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:41 · PVG 13:41 · LAX 21:41 · JFK 00:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.