Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组未重新编号_Javascript_Arrays_Indexing - Fatal编程技术网

Javascript 数组未重新编号

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[

在这种情况下,我必须从阵列和拼接中删除obj。发生的情况是数组没有正确重新编号,如下面所示

要在删除数组的对象后删除数组中未定义的占位符,请执行[].concat()。问题是新数组的编号不正确

以较低的开销对新阵列正确重新编号最有效的方法是什么

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
,因为以前