3

所以,我有一个包含多个值的 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);
    }
}

但是, slice 将就地更改数组的索引,因此现在i不会指向正确的索引点(因为任何更高的索引现在都i-nn是之前完成的切片数。

实现这一点的正确方法是什么?

4

5 回答 5

5

一种简单的方法是减少迭代器(这很有效,因为您每次迭代都读取长度 - 因此请确保避免缓存长度)

for (var i = 0; i < keymap['mappings'].length; i++) {
 if (keymap['mappings'][i]['id'] === id_to_match) {
    keyboard_map['mappings'].splice(i, 1);
    i--;
 }
}
于 2013-10-22T14:29:24.897 回答
2

我会使用过滤器方法:

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可用,最好使用它,因为它是原生的,这里我们只是模仿相同的行为。

于 2013-10-22T14:33:31.820 回答
1
for (var i = 0; i < keymap['mappings'].length; i++) {
    if (keymap['mappings'][i]['id'] === id_to_match) {
        keyboard_map['mappings'].splice(i--, 1);
    }
}
于 2013-10-22T14:30:09.247 回答
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);
    }
}
于 2013-10-22T14:31:56.443 回答
0

您可以像这样使用“过滤器”方法:

keymap.mappings = keymap.mappings.filter(function(element){
    return element.id != 1;
});

这意味着“只保留 id 不等于 1 的元素”或相同的结果“删除 id 等于 1 的元素”。

每个浏览器都实现了它,除了 IE8。 http://kangax.github.io/es5-compat-table/#Array.prototype.filter

于 2013-10-22T14:42:13.247 回答