Javascript 数组未重新编号
在这种情况下,我必须从阵列和拼接中删除obj。发生的情况是数组没有正确重新编号,如下面所示 要在删除数组的对象后删除数组中未定义的占位符,请执行[].concat()。问题是新数组的编号不正确 以较低的开销对新阵列正确重新编号最有效的方法是什么Javascript 数组未重新编号,javascript,arrays,indexing,Javascript,Arrays,Indexing,在这种情况下,我必须从阵列和拼接中删除obj。发生的情况是数组没有正确重新编号,如下面所示 要在删除数组的对象后删除数组中未定义的占位符,请执行[].concat()。问题是新数组的编号不正确 以较低的开销对新阵列正确重新编号最有效的方法是什么 for (var o = 0; o < uncheckedQue[i].childNodes.length; o += 1) { uncheckedQue[i].removeChild(uncheckedQue[i].childNodes[
for (var o = 0; o < uncheckedQue[i].childNodes.length; o += 1) {
uncheckedQue[i].removeChild(uncheckedQue[i].childNodes[o]);
if (uncheckedQue[i].childNodes.length < 1) {
delete uncheckedQue[i];//remove the document fragment if has no childnodes
};
};
uncheckedQue = [].concat(uncheckedQue);
0: DocumentFragment
2: DocumentFragment
3: DocumentFragment
4: DocumentFragment
5: DocumentFragment
6: DocumentFragment
7: DocumentFragment
length: 8
for(var o=0;o
***我来澄清一下。这些子节点包含在数组中的文档片段中。这些子节点不在Dom中
这是外环。您会注意到为什么我使用delete,所以我保持外部循环的长度正确
for (var i = 0; i < uncheckedQue.length; i += 1) {
//
if (t.mucs === t.mucsstop) { break; };
for (var o = 0; o < uncheckedQue[i].childNodes.length; o += 1) {
uncheckedQue[i].removeChild(uncheckedQue[i].childNodes[o]);
t.mucs += 1;
if (uncheckedQue[i].childNodes.length < 1) {
delete uncheckedQue[i];//remove the document fragment if has no childnodes
};
if (t.mucs === t.mucsstop) { break; };
};
};
for(变量i=0;i
使用拼接代替删除
if (uncheckedQue[i].childNodes.length < 1) {
uncheckedQue.splice(i,1)//remove the document fragment if has no childnodes
};
if(取消勾选[i].childNodes.length<1){
splice(i,1)//如果没有子节点,则删除文档片段
};
使用拼接代替删除
if (uncheckedQue[i].childNodes.length < 1) {
uncheckedQue.splice(i,1)//remove the document fragment if has no childnodes
};
if(取消勾选[i].childNodes.length<1){
splice(i,1)//如果没有子节点,则删除文档片段
};
是一个实时的节点列表,因此每次删除一个项目时,列表都会变短,因此可以有效地跳过每一个节点。如果要从文档片段中删除所有子节点,最简单的方法是继续删除firstChild节点,直到不再有:
var node = uncheckedQue[i];
while (node.firstChild) {
node.removeChild(node.firstChild);
}
另外,节点列表是主机对象,而不是数组,因此对其调用数组方法将抛出错误
编辑
从您的代码:
> for (var o = 0; o < uncheckedQue[i].childNodes.length; o += 1) {
正在从片段中删除子节点。因此现在位于childNodes[o]
的子节点就是执行该语句之前位于childNodes[o+1]
的子节点。因此在下一次迭代中,o+1
节点将是以前位于o+2
的节点。简单地说,它将删除每第二个孩子
此外:
由于节点列表的长度是0中的无符号整数,如果长度为0,则测试返回true
要从数组中删除片段,请按照VeXii的建议使用。但请注意,您必须调整索引或向后遍历数组,原因与删除活动节点列表的成员时相同
您会注意到为什么我使用delete,所以我保持外部循环的长度正确
for (var i = 0; i < uncheckedQue.length; i += 1) {
//
if (t.mucs === t.mucsstop) { break; };
for (var o = 0; o < uncheckedQue[i].childNodes.length; o += 1) {
uncheckedQue[i].removeChild(uncheckedQue[i].childNodes[o]);
t.mucs += 1;
if (uncheckedQue[i].childNodes.length < 1) {
delete uncheckedQue[i];//remove the document fragment if has no childnodes
};
if (t.mucs === t.mucsstop) { break; };
};
};
因为delete操作符不调整数组成员索引(它们只是属性名),所以您有一个稀疏数组。您可以使用splice并在运行时调整索引,也可以向后遍历阵列,或者在最后压缩阵列(这可能是性能最差的解决方案),例如
函数压缩数组(a){
对于(变量i=0;i){
a、 拼接(i,1);
}
}
返回a;
}
请注意,以上修改了原始数组。将数组成员复制到新数组更简单:
function compressArray(a) {
for (var i=0, iLen=a.length, b=[]; i<iLen; i++) {
if (a.hasOwnProperty(i)) {
b.push(a[i]);
}
}
return b;
}
函数压缩数组(a){
对于(var i=0,iLen=a.length,b=[];i是一个live节点列表,因此每次删除一个项目时,列表都会更短,因此可以有效地跳过每秒钟一个节点。如果要从文档片段中删除所有子节点,最简单的方法是继续删除第一个子节点,直到没有其他节点为止:
var node = uncheckedQue[i];
while (node.firstChild) {
node.removeChild(node.firstChild);
}
另外,节点列表是主机对象,而不是数组,因此对其调用数组方法将抛出错误
编辑
从您的代码:
> for (var o = 0; o < uncheckedQue[i].childNodes.length; o += 1) {
正在从片段中删除子节点。因此现在位于childNodes[o]
的子节点就是位于childNodes[o+1]的子节点
在执行该语句之前。因此,在下一次迭代中,o+1
节点将是以前位于o+2
的节点。简单地说,它将每秒钟删除一个子节点
此外:
由于节点列表的长度是0中的无符号整数,如果长度为0,则测试返回true
若要从数组中删除片段,请按照VeXii的建议使用。但请注意,您必须调整索引或向后遍历数组,原因与删除活动节点列表的成员时相同
您会注意到为什么我使用delete,所以我保持外部循环的长度正确
for (var i = 0; i < uncheckedQue.length; i += 1) {
//
if (t.mucs === t.mucsstop) { break; };
for (var o = 0; o < uncheckedQue[i].childNodes.length; o += 1) {
uncheckedQue[i].removeChild(uncheckedQue[i].childNodes[o]);
t.mucs += 1;
if (uncheckedQue[i].childNodes.length < 1) {
delete uncheckedQue[i];//remove the document fragment if has no childnodes
};
if (t.mucs === t.mucsstop) { break; };
};
};
因为delete操作符不调整数组成员索引(仅为属性名),所以您有一个稀疏数组。您可以使用splice并在执行时调整索引,或者在数组中向后执行,或者在最后压缩数组(这可能是性能最差的解决方案),例如
函数压缩数组(a){
对于(变量i=0;i){
a、 拼接(i,1);
}
}
返回a;
}
请注意,上面修改了原始数组。将数组成员复制到新数组更简单:
function compressArray(a) {
for (var i=0, iLen=a.length, b=[]; i<iLen; i++) {
if (a.hasOwnProperty(i)) {
b.push(a[i]);
}
}
return b;
}
函数压缩数组(a){
对于(var i=0,iLen=a.length,b=[];请注意,如果执行此操作,除非向后遍历数组,否则必须调整计数器i
,因为以前