2012-09-11 68 views
1

好的,我们有这个比较两个数据库的sql比较工具,并且发现了HTML中差异的报告。我需要解析它创建的JavaScript来了解有关差异的更多细节。例如,如果显示500个已更改的存储过程,则无法根据由谁进行更改或何时进行过滤。但是如果我能解析JS,我可以根据这些标准进行过滤。但是,他们的JS结构非常复杂,主要是嵌套数组,有时甚至低至4级。这是一个显示4个不同记录的示例。javascript数组元素是否知道它们的封闭数组?

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:为提高循环任何其他建议,欢迎,这只是一个样本,这个名单可以大得多。

+2

圣嵌套循环 –

+0

任何人或其他人写道,JavaScript的第一部分不知道如何编写JavaScript,因此不应该信任。 JSON的存在是有原因的。 – zzzzBov

+4

对标题的简短回答:不,项目不知道它们所在的数组。 – Guffa

回答

1

我可能会错过一些东西,但我认为答案相对简单:由于您知道您的阵列结构,因此您可以使用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/

创建一个函数来查找以“程序”启动项:

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])); 
+0

我不能依赖以word开头的数组在第5个位置。它可以根据程序体内的代码进行移位。他们只是将SP体中的每一行都放在一个数组中,因此它永远不会相同。如果开发人员没有包含它,我甚至可能找不到它,但这是另一个故事 – hsalama

+0

没问题 - 那么它只是一个动态查找过程的问题。我已经更新了我的答案,以说明如何做到这一点。 – Nate

1

如果这些数组的形式是不变的,我强烈建议将它们转换成本地javascrip PT对象,有利于改善和他们一起工作的简单:

var sqlObjs = []; 

for (var i = 0; i < createsql.length; i++){ 
    var item = createsql[i];  
    if (item.length != undefined && item.length > 1){ 
     sqlObjs.push({ 
      Procedure  : item[4][1].split(":")[1].trim(), 
      Description : item[5][1].split(":")[1].trim(), 
      CreationDate : new Date(item[6][1].split(":")[1].trim()), 
      CreatedBy  : item[7][1].split(":")[1].trim(), 
      TablesUpdated : item[8][1].split(":")[1].trim(), 
     }); 
    } 
} 

你可以搜索阵列中的一个更简洁的方式:

var match = "Jane Doe"; 

for (var i = 0; i < sqlObjs.length; i++){ 
    var item = sqlObjs[i]; 

    if (item.CreatedBy == match){ 
     console.log(item.Procedure); 
     break; 
    } 
} 

和你的生活会吸少。:)

你可以看到这方面的工作在这里:http://jsfiddle.net/5fVqZ/1/

你可以实现一个简单的搜索,找到你要找像这样的项目的价值:这是用来像

function getValue(byName, arry){ 
    var val = ""; 
    // this search assumes that the value will always be in the second position of the array 
    for (var i = 0; i < arry.length; i++){ 
     var aVal = arry[i][1]; 

     if (aVal.indexOf(byName) == 0){ // only grab the value if byName is at the start of the string 
      val = aVal.split(":")[1].trim(); 
      return val; 
     } 
    } 
    return val; 
} 

所以:

for (var i = 0; i < createsql.length; i++){ 
    var item = createsql[i];  
    if (item.length != undefined && item.length > 1){ 
     sqlObjs.push({ 
      Procedure  : getValue("Procedure", item), 
      Description : getValue("Description", item), 
      CreationDate : new Date(getValue("Creation Date", item)), 
      CreatedBy  : getValue("Created By", item), 
      TablesUpdated : getValue("Tables Updated", item), 
     }); 
    } 
} 

http://jsfiddle.net/5fVqZ/3/

+0

显然,如果这些数组对象的结构更加流畅,则需要修改解析它们的循环。 – Shmiddty

相关问题