2012-09-11 106 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

相關問題