2012-04-22 77 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。這將允許你保持原始數組完好無損,儘管看起來你不想/不需要這樣做。