javascript:无法删除数组的某些元素

时间:2014-06-15 08:15:51

标签: javascript jquery

http://jsfiddle.net/83m3B/

我想使用data-object-id属性删除数组的某些元素。 但是当我使用它时,循环不会按预期运行。看起来它每次都跳过一个元素。

var banIds = ["111", "222", "333"];
function toggle_visibility(className) {
  var elements = document.getElementsByClassName(className),
    n = elements.length;
  for (var i = 0; i < n; i++) {
    var e = elements[i];
    var statusID = e.getAttribute('data-object-id');
    if ($.inArray(statusID, banIds) !== -1) {
      e.remove();
    }
  }
}

有什么问题?我该如何解决呢?

3 个答案:

答案 0 :(得分:3)

只要jQuery可以接受,就没有理由不使用它的设施:

function toggle_visibility(className) {
    $('.' + className).filter(function() {
        return $.inArray($(this).data('object-id'), banIds) !== -1;
    }).remove();
}

答案 1 :(得分:2)

使用while周期进行删除。 For循环跳过元素,因为它们已被删除,而其他元素在数组中有另一个位置索引。

或者这样写:

if ($.inArray(statusID, banIds) !== -1) {
    e.remove();
    i--;
}

不要使用n,因为elements.length会在周期中发生变化。

答案 2 :(得分:0)

从索引列表中删除元素时,这是典型错误 您遗漏的事实是,删除元素后,删除后的所有元素都会在index中移动到index-1。因此,下一个元素接收与已删除的索引相同的索引但是循环仍然增加索引并在删除后跳过一个元素。
避免此问题的最简单方法是向后运行循环:

  for (var i = n-1; i >= 0; i--) {
    var e = elements[i];
    var statusID = e.getAttribute('data-object-id');
    if ($.inArray(statusID, banIds) !== -1) {
      e.remove();
    }