2012-04-22 72 views
1

我有一个数组:从JavaScript数组中删除索引数组

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

因为后每次迭代的各元素的索引已经改变。

那么我该如何做到这一点?

+1

从数组的末尾开始,并向后工作? – 2012-04-22 04:52:39

+1

对你的删除数组进行排序,以便按降序排列,所以你可以从'arr'数组的后面开始工作。 (或按升序排序,然后按相反顺序循环)。 – 2012-04-22 04:53:10

回答

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"] 
1

计数向后:

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

这里假设remove数组没有重复项,并进行排序。如果remove数组被反向排序,它仍然会遇到和以前一样的问题。另外,在for循环初始化部分应该是'I = remove.length - 1' – ricochet1k 2012-04-22 04:54:36

+0

更新了'长度1'。是的,我认为一种具有基于用户的后期发生,但它是一个公平点。 – Marc 2012-04-22 04:55:30

1

开始从最后循环,并删除的元素从最高指数第一。

2

不要改变你的想法太多 - 从最后开始。

ABCDE˚F..

当删除元件5,它成为..

ABCDE

然后删除元件3,它成为..

ABCE

这正是你想要的。

0

作为替代方案的建议,你可以使用.push()送你想保持到第三阵列的项目。基础知识见here。这将允许你保持原始数组完好无损,尽管看起来你不想/不需要这样做。