1

OK、2 つのデータベースを比較し、HTML の相違点のレポートを出力するこの SQL 比較ツールがあります。作成された 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"
                                }
                            }
                        } 
                }

            }    
    }
}

しかし、私が立ち往生しているのは、現在いる配列の親を取得するにはどうすればよいですか? たとえば、検索文字列が の場合、兄弟配列の 2 番目の要素であるJane Doe要素を取得したいと考えています。"Procedure : Schema.p_procedure2"私を撃たないでください!

ここにフィドルがあります

PS: ループを改善するための他の提案は大歓迎です。これは単なるサンプルであり、リストはもっと大きくなる可能性があります。

4

2 に答える 2

1

これらの配列の形式が一定である場合は、それらを操作しやすくするために、ネイティブの JavaScript オブジェクトに変換することを強くお勧めします。

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/

于 2012-09-11T16:42:46.447 に答える
1

何かが欠けているかもしれませんが、答えは比較的単純だと思います。配列構造を知っているので、探しているものに でアクセスできますcreatesql[i][4][1]

注: "Procedure" で始まる項目を動的に検索する場合は、もう少しコードを追加するだけで実行できます。あなたの質問の重要な答えはcreatesql[i]、適切な親配列から2番目の検索を開始することから始めることだと思います。

フィドル: 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]));
于 2012-09-11T16:25:47.680 に答える