我有一个包含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();
}
只删除一个元素。
答案 0 :(得分:4)
由于您在每次迭代后都会改变数组,array.length
会不断减少。因此,在您的示例中,循环只执行一次,因此只删除一个元素。
以下是您尝试实现目标的实例。
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;
答案 1 :(得分:3)
数组没有函数remove
。您可以使用myArray.splice(1)
之类的Array#splice;
const myArray = [1, 2, 3];
console.log(myArray);
myArray.splice(1);
console.log(myArray);
&#13;
如果您不想删除第一项,则需要获取搜索项的索引并转入splice
const myArray = [1, 2, 3];
const index = myArray.indexOf(2);
myArray.splice(index, 1);
console.log(myArray);
&#13;
或只使用Array#filter并传递谓词
const myArray = [1, 2, 3];
const filteredArray = myArray.filter(item => item !== 2);
console.log(filteredArray);
&#13;
答案 2 :(得分:0)
JavaScript NodeList
的工作方式与JavaScript Array
的工作方式不同,您拥有的是NodeList
。当您从DOM中删除/删除节点时,它也会从保留它的任何NodeList
中删除。因此,您需要迭代.length
的{{1}}但您 希望您的增量表达式实际增加:
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;
以上代码段的<Data><G>"Val"="5"</G></Data>
<Data><G>"Val"="6"</G></Data>
<Data><G>"Val"="7"</G></Data>
循环会在for
期间进行迭代,但不会增加i < dataNodes.length
,因此i
为i
{1}}迭代总是dataNodes.length
。这样,它会在每次迭代时从0
中删除索引0
。在控制台中,您可以通过删除DOM中的dataNodes
来查看您还将其从node
dataNode
中移除:
NodeList