【问题标题】:Why are empty items in my array and how do I get rid of them? [duplicate]为什么我的数组中有空项目,我该如何摆脱它们? [复制]
【发布时间】:2019-01-12 06:37:54
【问题描述】:

我正在使用 Visual Studio Code。我正在尝试使用 JavaScript 返回一个只有奇数的数组。这是代码:

function oddCouple(arr) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] % 2 == 0) {
      delete arr[i];
    }
  }
  return arr;
}

console.log(oddCouple([2, 6, 7, 0, 1, 3, 7, 5]));

这就是我得到的。我不想要空项目,只想要奇数。

[ <2 empty items>, 7, <1 empty item>, 1, 3, 7, 5 ]

【问题讨论】:

  • 您不能使用delete 删除数组中的项目
  • 这在技术上是不正确的。 delete 将删除时间,它只是不会重组数组(删除项目所在的插槽/索引),我确定这就是您所指的。但是项目本身(插槽/索引中的数据)在技术上已被删除。

标签: javascript arrays function for-loop


【解决方案1】:

delete 函数删除项目的内容,但保留一个空槽。

您需要splice 方法来移除元素而不留下空槽。

arr.splice(i, 1);

【讨论】:

    【解决方案2】:

    delete operator 删除对象的属性。这是具有数组值的索引。结果是sparse array

    为了得到一个没有某些项目的数组,你可以过滤数组。

    function oddCouple(array) {
        return array.filter(v => v % 2);
    }
    
    console.log(oddCouple([2, 6, 7, 0, 1, 3, 7, 5]));

    或者如果您需要相同的数组引用,那么您可以使用Array#splice并从末尾迭代数组,因为在拼接项目后索引会发生变化。

    function oddCouple(array) {
        var i = array.length;
        while (i--) {
            if (array[i] % 2 === 0) {
                array.splice(i, 1);
            }
        }
        return array;
    }
    
    console.log(oddCouple([2, 6, 7, 0, 1, 3, 7, 5]));

    【讨论】:

      【解决方案3】:

      您需要使用splice() 而不是 delete,因为delete 不会更改数组的长度。但是在for 循环中使用splice() 时要小心,因为您在循环遍历数组时会更改数组,但效果不佳。

      另一种方法是向后循环:

      function oddCouple(arr) {
        for (let i = arr.length - 1; i >= 0; i--) {
          if (arr[i] % 2 == 0) {
            arr.splice(i, 1);
          }
        }
        return arr;
      }
      
      console.log(oddCouple([2, 6, 7, 0, 1, 3, 7, 5]));

      当然更好的选择是使用filter(),但请注意这不会改变原始数组。

      function oddCouple(arr) {
        return arr.filter(i => i % 2)  
      }
      
      console.log(oddCouple([2, 6, 7, 0, 1, 3, 7, 5]));

      【讨论】:

        【解决方案4】:

        您可以通过过滤真值返回数组:

        function oddCouple(arr) {
          for (let i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 0) {
              delete arr[i];
            }
          }
          return arr.filter(r=>r);
        }
        
        console.log(oddCouple([2, 6, 7, 0, 1, 3, 7, 5]));

        相反,我可以做的很简单:

        const arr = [2,6,7,0,1,3,7,5]
        console.log(arr.filter(r=>r%2!=0))
        //or,
        console.log(arr.filter(r=>r%2)) // !=0

        【讨论】:

          猜你喜欢
          • 2019-06-07
          • 1970-01-01
          • 1970-01-01
          • 2020-12-25
          • 2012-07-29
          • 2011-08-14
          • 1970-01-01
          • 1970-01-01
          • 2012-04-18
          相关资源
          最近更新 更多