使用递归javascript函数维护数组值

使用递归javascript函数维护数组值,javascript,function,recursion,local-variables,Javascript,Function,Recursion,Local Variables,我有一个我们在工作中使用的程序,它将数据输出到XML文件中(其中几个)。我正在尝试开发一个HTA(是的,是HTA,我很抱歉)来读取这些文件并处理它们的数据。不幸的是,有很多XML文件,我只需要读取一些特定的文件,所以我尝试编写一个通用的“XML到数组”函数 我用它来读取XML文件,现在我想把文件处理成一个2d数组。然而,由于我使用的是递归函数,所以我似乎丢失了数据。以下是函数: NodesToArray = function (xmlDOC){ //Must redeclare "i"

我有一个我们在工作中使用的程序,它将数据输出到XML文件中(其中几个)。我正在尝试开发一个HTA(是的,是HTA,我很抱歉)来读取这些文件并处理它们的数据。不幸的是,有很多XML文件,我只需要读取一些特定的文件,所以我尝试编写一个通用的“XML到数组”函数

我用它来读取XML文件,现在我想把文件处理成一个2d数组。然而,由于我使用的是递归函数,所以我似乎丢失了数据。以下是函数:

NodesToArray = function (xmlDOC){

    //Must redeclare "i" with each recursion, or it won't work correctly. ie: for(VAR i = 0...  
    for(var i = 0; i < xmlDOC.length ; i++){

        //Just because it has a child still do the check.
        if(xmlDOC[i].childNodes.length > 1){

             //Recursively run the function.
             var ReturnArray = NodesToArray(xmlDOC[i].childNodes);
             //alert(ReturnArray + " " );   

             if(ReturnArray) return ReturnArray;

     }else{

    //Check to see if the node has a child node, if not and a child node is called, it will error out and stop
    if(xmlDOC[i].hasChildNodes() == true){

        return xmlDOC[i].firstChild.nodeValue;

         }
       }    
     }  
   } 
nodestoray=函数(xmlDOC){
//必须在每个递归中重新声明“i”,否则它将无法正常工作。。。
对于(var i=0;i1){
//递归地运行函数。
var ReturnArray=NodesToArray(xmlDOC[i].childNodes);
//警报(返回数组+“”);
if(ReturnArray)返回ReturnArray;
}否则{
//检查节点是否有子节点,如果没有,并且调用了子节点,它将出错并停止
if(xmlDOC[i].hasChildNodes()==true){
返回xmlDOC[i].firstChild.nodeValue;
}
}    
}  
} 
在我返回第一个子值的地方,我放了一个警报,能够看到我想要的所有数据。当然,当我设置它时,我发现它没有保存数据。我读了很多书,一直用头撞着我的桌子,但仍然找不到任何东西

我已经在谷歌上搜索过这个网站,并咨询过很多论坛,但找不到任何适合我的东西。我不情愿地在这里发帖,因为我已经穷途末路了。谢谢你的帮助,我会尽我所能提供更多的信息

请注意,我希望在没有任何库(特别是jQuery)的情况下也能做到这一点。HTA似乎不支持很多较新的Javascript。无论如何,我都不是一个专业的程序员,从零开始学习

不知道如何设置解决方案,但我找到了

函数节点数组(xmlDOC,returnArray){
对于(var i=0;i1){
returnArray[returnArray.length]=NodeStoreArray(xmlDOC[i].childNodes,[]);
}否则{
如果(xmlDOC[i].hasChildNodes()==true){
returnArray[returnArray.length]=(xmlDOC[i].firstChild.nodeValue);
}
}
}
返回数组;
}
getArray=NodesToArray(getXML.getElementsByTagName(标记名)[0].childNodes,[]);

感谢您的帮助!

当处理第一个元素时,您的程序将退出,因为函数返回。函数只能返回一次。您需要将返回语句移到循环之外,以便循环完成。

在同一容器中递归检索数据的一般方法是编写两个函数:

NodesToArray = function (xmlDOC){

    //Must redeclare "i" with each recursion, or it won't work correctly. ie: for(VAR i = 0...  
    for(var i = 0; i < xmlDOC.length ; i++){

        //Just because it has a child still do the check.
        if(xmlDOC[i].childNodes.length > 1){

             //Recursively run the function.
             var ReturnArray = NodesToArray(xmlDOC[i].childNodes);
             //alert(ReturnArray + " " );   

             if(ReturnArray) return ReturnArray;

     }else{

    //Check to see if the node has a child node, if not and a child node is called, it will error out and stop
    if(xmlDOC[i].hasChildNodes() == true){

        return xmlDOC[i].firstChild.nodeValue;

         }
       }    
     }  
   } 
  • 第一个是您调用的并返回数组的
  • 第二个由第一个函数调用并执行递归。为了能够将数据放在同一个数组中,该函数必须将其作为参数
  • 下面是一些伪代码

    getData(node) {
       _2D_array = new array[][];
       getData(node, _2D_array, 0);
       return array;
    }
    
    getData(node, _2D_array, depth) {
       if(node) { // end of recursion ?
           _2D_array[depth].add(...); // populate from node
           getData(node.next, _2D_array, depth++);
       }
    }
    

    我试过这样做,但每次调用函数时,它都只调用第二个函数。如何区分它们?这两个函数都是通过签名
    node
    vs
    node,array
    ,第二个函数调用自身->
    node,array
    。你必须注意数组总是有足够的空间/可以使用这可能是我在HTA中运行的,但是当我重命名第二个函数时(使用您的示例)要获取数据2,或者在我的例子中是NodesToArray2,它获取数据,尽管它将数据放在一维数组中而不是多维数组中。@Josh编辑了伪代码来处理二维数组。您必须初始化二维数组并确保它可以扩展,因为您递归调用函数,在初始化时无法知道生成的数组有多大我会的。我找到了一个解决方案,但是我能够使用1个函数得到它,尽管您的伪代码是我找到它的原因。感谢您的帮助(解决方案已在顶部编辑)