2017-02-09 8 views
2

Seleniumとnodejを使用してhtmlテーブルを反復処理し、配列の文字列をテーブルセルの文字列に一致させます。Javascript:ループ内のインクリメントカウンタ変数

配列は["名前"、 "住所2"、 "住所3"、...]であり、tr [1]の値はArr [0]、tr [2] ]とArr [1]などを使用します。

htmlテーブルには配列内の各アイテムの行がありますが、Address2のデータがない場合は表示されません。

この場合、tr [3]はArr [3]と一致しないことがわかります。 tr [4]に移動する代わりに、tr [3]がArr [4]、Arr [5]などと一致するかどうかを確認したいと思います。テーブル内の項目は常に配列内の項目と同じ順序になりますだから、私は配列の項目が "不一致"の必要はありません。

関連性がある場合に備えて関数全体を投稿しましたが、問題は次のループ反復に新しい値を渡すために "i = i - 1"を得ることができないと思われます。

私はElseセクションに入ることを証明しました.i-1の値は、その時点で期待したとおりです。

var retrieveData = function retrieveData(Arr){ 

j = 0 

driver.findElements(webdriver.By.xpath("//*[@class='table-container']")).then (function(rows){ 

    rowCount = rows.length; 
    console.log("Row count = " + rowCount); 

}).then (function(fn){ 

    for (i = 1;i < rowCount + 1; i++){ 

     (function(i){ 

      var element = driver.findElement(webdriver.By.xpath("//div[@class='table-container']["+i+"]/div/strong/a")); 

      element.getText().then(function(Type){ 

       var typefromArray = String(Arr[j].split(':')[0]); 

       if (Type == typefromArray){ 

        // Do something 

        j = j + 1; 

       } else { 

        // Do something 

        i = i - 1 // My problem looks to be here, but may be in the transfer of this back up to the beginning of the loop  
        j = j + 1; 

       } 

      }); 

     })(i); 

    }; 

}); 

}; 

module.exports.retrieveData = retrieveData; 
+1

- IIFEの内部に「1」を含む。また、 'i - 'と 'j ++'を使うこともできます。 –

+0

こんにちは、すばらしい返答をいただきありがとうございます。文字列が一致しない(If文がFalseを返す)場合にのみカウンタを減少させたい。どうすればi = i - 1(またはi--)をElseの外に保つことができますか? – user7540600

+0

'(function(i){'宣言で 'i'のスコープをシャドーイングしています。 – Sunshine

答えて

4

あなたは、インデックスを通過するためにあなたのfor -loopでIIFEを使用しています。 iの変更を防ぐように設計されているようです。

あなたは、関数の最後で

i = i - 1 

を行うと、それは唯一のあなたの関数内iに影響を与えるので、それは絶対に全く影響を及ぼしません。
Here's a good article JavaScriptの変数スコープについて

しかし、あなたはまだiを変更したい場合は、その一つの選択肢は、単にそれが匿名関数によって返され、外部i変数に割り当てることがしていることであろう。

.then (function(fn){ 
    for (i = 1;i < rowCount + 1; i++){ 
     i = (function(i){ 
      var element = driver.findElement(webdriver.By.xpath("//div[@class='table-container']["+i+"]/div/strong/a")); 
      element.getText().then(function(Type){ 
       var typefromArray = String(Arr[j].split(':')[0]); 
       if (Type == typefromArray){ 
        // Do something 
        j = j + 1; 
       } else { 
        // Do something 
        i = i - 1 // My problem looks to be here, but may be in the transfer of this back up to the beginning of the loop  
        j = j + 1; 
       } 
      }); 
      return i; 
     })(i); 
    }; 

問題を解決しますあなたは尋ねました。


しかし、私はあなたが、同期ループを使用して、まだ非同期に呼び出された関数(element.getText().thenに渡された関数)にカウンタを更新しているとして、あなたのコード内の他の問題があるだろう確信しています。

JavaScriptで非同期コードを処理する方法(現在はPromisesを使用しています)を解決する方法を検討したり、問題を解決しようとするより一般的な質問を開いたりすることをお勧めします克服すべきより多くの設計上の障害。

は、ここでは、複数の約束を扱う(コピー&ペーストすることを意味するものではなく、簡潔にするためにES2015を使用)するために使用する必要がありパターンの種類の例です:あなたは `I = I持って

.then(function(fn) { 
    Promise.all(
    Array(rowCount).fill(true).map((_, i) => i + 1) // => [1..rowCount] 
     .map(i => { 
     const element = driver.findElement(webdriver.By.xpath("//div[@class='table-container']["+i+"]/div/strong/a")); 
     return element.getText(); 
     }) 
    // Here we have an array of Promises that we pass to Promise.all 
    // so we can wait until all promises are resolved before executing 
    // the following .then 
).then(types => types.filter(type => type === typefromArray) 
         .map(type => { /* doSomething */ }); 
}); 
+0

このような詳細で答える時間をとってくれてありがとう、私はまだたくさんのことを学んでいます! – user7540600

+1

私は調べました私のカウンター変数がインクルードされる前にインクリメントするのを止めてしまったことを知っていることを理解するだけではありません。コンソールに出力すると、それがなくても私には間違った価値が与えられていた(それはうまくいきましたが) – user7540600

関連する問題