1

我有一个数组:

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]);
}

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

那么我该怎么做呢?

4

5 回答 5

2
> 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"]
于 2012-04-22T04:52:20.493 回答
2

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

ABCDE F..

当您删除元素 5 时,它变为..

ABCDE

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

ABCE

这正是你想要的。

于 2012-04-22T04:53:39.603 回答
1

倒数:

// RIGHT
for (i = (remove.length-1); i >= 0; i--) {
  arr.splice(remove[i]);
}
于 2012-04-22T04:52:35.717 回答
1

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

于 2012-04-22T04:52:40.897 回答
0

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

于 2012-04-22T05:15:52.820 回答