2013-10-22 37 views
3
循環從陣列中刪除多個項目

所以,我有多個值的JavaScript數組:如何通過在Javascript

var keymap = {'name': 'foobaz', 
       'mappings': [{'id': 1, 'key': 'b'}, 
          {'id': 2, 'key': 'c'}, 
          {'id': 3, 'key': 'd'}, 
          {'id': 1, 'key': 'e'}, 
          {'id': 10, 'key': 'f'}, 
          {'id': 7, 'key': 'g'}, 
          {'id': 1, 'key': 'h'}] 
} 

我想刪除其中的關鍵是「B」的任何條目。請注意,ID對應於後端ID。我想要做的是刪除一些映射(例如,所有的'id'都是'1')。

我已經試過是:

for (var i = 0; i < keymap['mappings'].length; i++) { 
    if (keymap['mappings'][i]['id'] === id_to_match) { 
     keyboard_map['mappings'].splice(i, 1); 
    } 
} 

然而,切片將改變就地數組的索引,因此現在i不會指向正確的指數點(如任何指標較高現在將i-n其中n將切片數之前完成。

什麼是實現這一正確的方法是什麼?

回答

5

一個簡單的方法是遞減的迭代器(這個工程因爲y OU閱讀每次迭代的長度 - 所以一定要避免緩存長度)

for (var i = 0; i < keymap['mappings'].length; i++) { 
if (keymap['mappings'][i]['id'] === id_to_match) { 
    keyboard_map['mappings'].splice(i, 1); 
    i--; 
} 
} 
1
for (var i = 0; i < keymap['mappings'].length; i++) { 
    if (keymap['mappings'][i]['id'] === id_to_match) { 
     keyboard_map['mappings'].splice(i--, 1); 
    } 
} 
1

你可以走你的陣列向後,使拼接不影響以後的循環迭代:

for (var i = keymap['mappings'].length - 1; i >= 0; i--) { 
    if (keymap['mappings'][i]['id'] === id_to_match) { 
     keyboard_map['mappings'].splice(i, 1); 
    } 
} 
2

我會使用filter方法:

var id_to_remove = 1; 
keymap.mappings = keymap.mappings.filter(function(item) { 
    return item.id !== id_to_remove; 
})); 

注意,除了使用filter方法與否,即使是簡單的for循環,性能要好得多從頭創建一個新的數組,而不是多次變更當前數組。所以基本上:

var id_to_remove = 1; 
var filtered = []; 
for (var i = 0, item; item = keymap.mappings[i++];) { 
    if (item.id !== id_to_remove) 
     filtered.push(item); 
} 
keymap.mappings = filtered; 

當然,如果filter可用它更好的使用它,因爲它是天然的,在這裏我們只是模仿相同的行爲。