NodeList数据未被删除

时间:2017-11-18 06:39:55

标签: javascript nodelist xmlnodelist

我有一个包含3个对象的数组对象。我想删除除第一个之外的所有对象。

这是我从XML获得的数据:

mrArr[0] = <Data>
                <G> "Val" = "5" </G>
           </Data>  
mrArr[1] = <Data>
                <G> "Val" = "6" </G>
           </Data>
mrArr[2] = <Data>
                <G> "Val" = "7" </G>
           </Data>

我创建了一个循环来尝试这样做,但它只删除了一个元素。我的循环出了什么问题?:

for(var i = 1; i < myArr.length; i++){
    myArr[i].remove();
}

只删除一个元素。

3 个答案:

答案 0 :(得分:4)

由于您在每次迭代后都会改变数组,array.length会不断减少。因此,在您的示例中,循环只执行一次,因此只删除一个元素。

以下是您尝试实现目标的实例。

&#13;
&#13;
var nodes = document.getElementsByTagName('div');

console.log('Before removal:', nodes);

while (nodes.length > 1) {
  var node = nodes[nodes.length - 1];
  node.parentNode.removeChild(node);
}

console.log('After removal:', nodes);
&#13;
<div id="div-01">Here is div-01</div>
<div id="div-02">Here is div-02</div>
<div id="div-03">Here is div-03</div>
&#13;
&#13;
&#13;

答案 1 :(得分:3)

数组没有函数remove。您可以使用myArray.splice(1)之类的Array#splice;

&#13;
&#13;
const myArray = [1, 2, 3];
console.log(myArray);

myArray.splice(1);
console.log(myArray);
&#13;
&#13;
&#13;

如果您不想删除第一项,则需要获取搜索项的索引并转入splice

&#13;
&#13;
const myArray = [1, 2, 3];
const index = myArray.indexOf(2);
myArray.splice(index, 1);

console.log(myArray);
&#13;
&#13;
&#13;

或只使用Array#filter并传递谓词

&#13;
&#13;
const myArray = [1, 2, 3];
const filteredArray = myArray.filter(item => item !== 2);

console.log(filteredArray);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

JavaScript NodeList的工作方式与JavaScript Array的工作方式不同,您拥有的是NodeList。当您从DOM中删除/删除节点时,它也会从保留它的任何NodeList中删除。因此,您需要迭代.length的{​​{1}}但您 希望您的增量表达式实际增加:

&#13;
&#13;
NodeList
&#13;
dataNodes = document.getElementsByTagName("Data");
count = 0; // debug
for (i = 0; i < dataNodes.length; i) {
  console.log('Iteration #',++count,':',dataNodes); // debug
  dataNodes[i].parentNode.removeChild(dataNodes[i]);
}
&#13;
&#13;
&#13;

以上代码段的<Data><G>"Val"="5"</G></Data> <Data><G>"Val"="6"</G></Data> <Data><G>"Val"="7"</G></Data>循环会在for期间进行迭代,但不会增加i < dataNodes.length,因此ii {1}}迭代总是dataNodes.length。这样,它会在每次迭代时从0中删除索引0。在控制台中,您可以通过删除DOM中的dataNodes来查看您还将其从node dataNode 中移除:

NodeList