【问题标题】:Remove an array of indices from a JavaScript array从 JavaScript 数组中删除索引数组
【发布时间】:2012-05-03 03:59:05
【问题描述】:

我有一个数组:

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G']

并且我有一个要删除的索引数组:

var remove = [1, 3, 5]

所以结果是:

arr ==== ['A', 'C', 'E', 'G']

我不能在循环中使用拼接:

// WRONG
for (i = 0, l = remove.length; i < l; i++) {
    arr.splice(remove[i]);
}

因为每次迭代后每个元素的索引都发生了变化。

那么我该怎么做呢?

【问题讨论】:

  • 从数组末尾开始,向后工作?
  • 对删除数组进行排序,使键按降序排列,这样您就可以从 arr 数组的后面开始工作。 (或按升序排序,然后按相反顺序循环)。

标签: javascript arrays indices


【解决方案1】:
> arr.filter(function(x,i){return remove.indexOf(i)==-1})
["A", "C", "E", "G"]

为了更高效,首先将remove 转换为对象/哈希表,如下所示:

var removeTable = {}
remove.forEach(function(x){removeTable[x]=true})

> arr.filter(function(x,i){return removeTable[i]})
["A", "C", "E", "G"]

【讨论】:

    【解决方案2】:

    不要过多地改变你的想法——从头开始。

    A B C D E F..

    当你删除元素 5 时,它变成了..

    A B C D E

    然后你删除元素 3,它就变成了..

    A B C E

    这正是你想要的。

    【讨论】:

      【解决方案3】:

      倒数:

      // RIGHT
      for (i = (remove.length-1); i >= 0; i--) {
        arr.splice(remove[i]);
      }
      

      【讨论】:

      • 这假定删除数组没有重复,并且已排序。如果删除数组是反向排序的,它仍然会出现与以前相同的问题。另外,for循环的init部分应该是i = remove.length - 1
      • 为length-1 更新。是的,我假设已经根据用户的帖子进行了排序,但这是一个公平的观点。
      【解决方案4】:

      从最后一个开始循环并首先从最高索引中删除元素。

      【讨论】:

        【解决方案5】:

        作为替代建议,您可以使用.push() 将您想要保留的项目发送到第三个数组。有关基础知识,请参阅here。这将允许您保持原始数组完整,尽管您似乎不想/不需要这样做。

        【讨论】:

          猜你喜欢
          • 2020-06-25
          • 2021-11-29
          • 2012-12-27
          • 2015-07-19
          • 2018-09-20
          • 1970-01-01
          • 1970-01-01
          • 2015-07-27
          • 2015-04-07
          相关资源
          最近更新 更多