好的,我们有这个sql比较工具,它可以比较两个数据库并吐出HTML差异报告。我需要解析它创建的JavaScript,以找到有关差异的更多详细信息。例如,如果它显示500个已更改的存储过程,则无法按更改者或更改时间进行筛选。但是,如果我可以解析JS,则可以基于此类条件进行过滤。但是,它们的JS结构非常复杂,并且主要是嵌套数组,有时可以深到4级。这是显示4个不同记录的示例。

var createsql  = new Array(

new Array(new Array(0, "Error, No SQL Availible")),

new Array (
  new Array(0,"-- Stored Procedure", " "),
  new Array(0,"", ""),
  new Array(1,"--------------------------------------------------------------------------------------", " "),
  new Array(1,"/*", " "),
  new Array(1,"Procedure        : Schema.p_procedure1", " "),
  new Array(1,"Description       : This process will do something", " "),
  new Array(1,"Creation Date  : 11/24/2009", " "),
  new Array(1,"Created By       : John Doe", " "),
  new Array(1,"Tables Updated : None", " "),
  new Array(1,"*/", " "),
  new Array(0, "", "")
),



new Array (
  new Array(0,"-- Stored Procedure", " "),
  new Array(0,"", ""),
  new Array(1,"--------------------------------------------------------------------------------------", " "),
  new Array(1,"/*", " "),
  new Array(1,"Procedure        : Schema.p_procedure2", " "),
  new Array(1,"Description       : This process will do something", " "),
  new Array(1,"Creation Date  : 11/24/2011", " "),
  new Array(1,"Created By       : Jane Doe", " "),
  new Array(1,"Tables Updated : None", " "),
  new Array(1,"*/", " "),
  new Array(0, "", "")
),



new Array (
  new Array(0,"-- Stored Procedure", " "),
  new Array(0,"", ""),
  new Array(1,"--------------------------------------------------------------------------------------", " "),
  new Array(1,"/*", " "),
  new Array(1,"Procedure        : Schema.p_procedure3", " "),
  new Array(1,"Description       : This process will do something", " "),
  new Array(1,"Creation Date  : 11/24/2012", " "),
  new Array(1,"Created By       : Mark Doe", " "),
  new Array(1,"Tables Updated : None", " "),
  new Array(1,"*/", " "),
  new Array(0, "", "")
)


);


我可以解析数组并使用此代码获得所需的内容

var match = "Jane Doe";
var createLength = createsql.length;
var matched;

for(var i = 0; i < createLength; i++){
    if(typeof createsql[i] === "object"){
        var firstArrayLength = createsql[i].length;
            for(var j = 0; j < firstArrayLength; j++){
                if(typeof createsql[i][j] === "object"){
                    var secondArrayLength = createsql[i][j].length;
                        for(var k = 0; k < secondArrayLength ; k++){
                            if(typeof createsql[i][j][k] === 'string'){
                                if((createsql[i][j][k].indexOf(match) != -1)){
                                    console.log(createsql[i][j][k]);
                                    console.log('matched');
                                    //need to grab the parent and search its elemets for the one that starts with the word "Procedure"
                                }
                            }
                        }
                }

            }
    }
}


但是我遇到的是如何获取当前所在数组的父级?例如,如果我的搜索字符串是Jane Doe,我想检索表示"Procedure : Schema.p_procedure2"的元素,它是同级数组中的第二个元素。
请不要射击我!

Here is the fiddle

PS:欢迎提出任何其他改进循环的建议,这只是一个示例,列表可能更大。

最佳答案

我可能会遗漏一些东西,但是我认为答案是相对简单的:由于您知道数组的结构,因此可以使用createsql[i][4][1]访问所需的内容。

注意:如果要动态搜索以“ Procedure”开头的项目,则只需添加一些代码即可。我认为您的问题的关键答案是,您只是从createsql[i]开始从适当的父数组开始第二次搜索。

小提琴:http://jsfiddle.net/nate/DBM7H/2/

console.log('Procedure', createsql[i][4][1]);

更新:

这是一个如何动态查找过程项的示例。

小提琴:http://jsfiddle.net/nate/DBM7H/4/

创建一个函数以查找以“ Procedure”开头的项目:

var findProcedure = function (record) {
    var i, length;
    for (i = 0, length = record.length; i < length; i += 1) {
        if (record[i][1].substring(0, 9) === 'Procedure') {
            return record[i][1];
        }
    }
}


然后,将该函数与代码中的正确记录一起使用:

// Find the procedure
console.log(findProcedure(createsql[i]));

关于javascript - javascript数组元素是否知道其封闭的数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12373977/

10-11 23:19
查看更多