在Javascript中使用.splice()删除数组中的值

在Javascript中使用.splice()删除数组中的值,javascript,arrays,splice,Javascript,Arrays,Splice,我正在尝试循环一个数组并删除任何等于false、null、0、undefined、NaN或“”的值 当我调用函数时,它应该返回一个空白数组,但现在它正在输出[null,0,null,null,“]。这是我到目前为止所拥有的 function bouncer(arr) { for(i=0;i<arr.length;i++){ if(arr[i]===false||null||0||undefined||NaN||""){ arr.splice

我正在尝试循环一个数组并删除任何等于false、null、0、undefined、NaN或“”的值

当我调用函数时,它应该返回一个空白数组,但现在它正在输出
[null,0,null,null,“]
。这是我到目前为止所拥有的

 function bouncer(arr) {
      for(i=0;i<arr.length;i++){
        if(arr[i]===false||null||0||undefined||NaN||""){
          arr.splice(i,1);
        }
      }
    return arr;
    }

bouncer([false, null, 0, NaN, undefined, ""]);
功能弹跳器(arr){

对于(i=0;i而言,问题在于这条线:

if(arr[i]===false||null||0||undefined||NaN||""){...}
比较多个值的正确方法是:

if(arr[i]===false|| arr[i]=== null|| arr[i]===  0||arr[i] ===  undefined|| arr[i] ===  NaN|| arr[i]===  ""){ ..}
您可以进一步简化它,因为我们需要过滤的所有值都自然计算为false

if(!arr[i])
使用针对拼接调整的索引重新实现功能:

function bouncer(arr){
    for( var i = 0 ; i < arr.length ; i++ ){
        if(!arr[i]){
            arr.splice(i--,1);
        }
    }
    return arr;
}

这一行的问题在于:

if(arr[i]===false||null||0||undefined||NaN||""){...}
比较多个值的正确方法是:

if(arr[i]===false|| arr[i]=== null|| arr[i]===  0||arr[i] ===  undefined|| arr[i] ===  NaN|| arr[i]===  ""){ ..}
您可以进一步简化它,因为我们需要过滤的所有值都自然计算为false

if(!arr[i])
使用针对拼接调整的索引重新实现功能:

function bouncer(arr){
    for( var i = 0 ; i < arr.length ; i++ ){
        if(!arr[i]){
            arr.splice(i--,1);
        }
    }
    return arr;
}
错误:

  • 如果(arr[i]==false | | | arr[i]==null | | arr[i]==0 | | | arr[i]==undefined | | arr[i]==NaN | | arr[i]==”),则应为
  • 由于
    NaN!==NaN
    ,应使用
    isNaN(arr[i])
  • if(…){
    阵列拼接(i,1);
    我--;//这里应该减去一!
    }
  • 错误:

  • 如果(arr[i]==false | | | arr[i]==null | | arr[i]==0 | | | arr[i]==undefined | | arr[i]==NaN | | arr[i]==”),则应为
  • 由于
    NaN!==NaN
    ,应使用
    isNaN(arr[i])
  • if(…){
    阵列拼接(i,1);
    我--;//这里应该减去一!
    }

  • 您可能需要再次阅读javascript语言语法描述

    if(arr[i]===false||null||0||undefined||NaN||"") ...
    
    意味着,如果arr[i]为false,或null为true,或0为true,或undefined为true,或NaN为true,或“”为true。第一部分取决于arr[i]是什么,但其余部分都为false。这意味着我们可以将您的陈述简化为:

    if (arr[i] === false) ...
    
    因为所有其他的都是假的。但是推断你想做什么,你可能想说

    if (arr[i] == false) ...
    
    它将执行更松散、更不严格的比较(即,它不会检查被比较元素的类型),并将测试我推断您想要的内容

    但是,您的逻辑还有另一个问题:您在迭代数组时删除元素,
    i
    在从数组下删除元素时前进。另一种方法可能是构建返回的数组(而不是修改输入数组)


    您可能需要再次阅读javascript语言语法描述

    if(arr[i]===false||null||0||undefined||NaN||"") ...
    
    意味着,如果arr[i]为false,或null为true,或0为true,或undefined为true,或NaN为true,或“”为true。第一部分取决于arr[i]是什么,但其余部分都为false。这意味着我们可以将您的陈述简化为:

    if (arr[i] === false) ...
    
    因为所有其他的都是假的。但是推断你想做什么,你可能想说

    if (arr[i] == false) ...
    
    它将执行更松散、更不严格的比较(即,它不会检查被比较元素的类型),并将测试我推断您想要的内容

    但是,您的逻辑还有另一个问题:您在迭代数组时删除元素,
    i
    在从数组下删除元素时前进。另一种方法可能是构建返回的数组(而不是修改输入数组)


    如果条件是错误的,那么这不是根据多个值检查变量的方式。此外,在修改数组时,如果没有采取适当的步骤(例如向后迭代),您不应该迭代数组。您是否考虑过使用该方法?此外,一旦删除一个元素,所有其他元素都将移位。因此,如果删除arr[0],for循环将在下次使用arr[1]时继续,但随着数组的移动,arr[1]与arr[2]的情况相同。因此,您将跳过元素(尝试按相反的顺序来避免此情况)。此外,您是否知道
    如果(!arr[i]){
    会帮你完成大部分工作吗?@PatrickEvans你能更具体地说明我的if条件到底出了什么问题吗?你是if条件出了问题,这不是根据多个值检查变量的方式。另外,在修改数组时,如果没有采取适当的步骤,你不应该迭代数组(例如向后迭代)您考虑过使用吗?另外,一旦删除一个元素,所有其他元素都将被移动。因此,如果删除arr[0],for循环将在下次使用arr[1]继续,但随着数组的移动,arr[1]将是arr[2]的原状态。因此,您将跳过元素(尝试以相反的顺序来避免此情况)还有,你知道如果(!arr[i]){
    能帮你完成大部分工作吗?@PatrickEvans你能更具体一点我的if条件到底出了什么问题吗?2.条件应该是arr[i]==isNaN(nan)?@PaulPearce
    isNaN(arr[i])
    2.条件应该是arr[i]==isNaN吗?@PaulPearce
    isNaN(arr[i])
    @RaphaMex我试着在我的浏览器控制台上用一些日志进行实验..我觉得没问题..你能给我一个可能发生这种情况的例子吗?对不起,你是对的,
    .length
    在每个循环中都会重新计算。没有什么可编辑的。@RaphaMex我试着在我的浏览器控制台上用一些日志进行实验..我觉得没问题..你能给我一个例子w吗这里可能会发生这种情况?很抱歉,您是对的,
    .length
    会在每个循环中重新计算。无需编辑。