2017-02-09 43 views
2

我正在使用Selenium和nodejs遍歷一個html表,並將一個字符串從數組匹配到表格單元格中的字符串。Javascript:增量計數器內循環變量

我的數組可能是[「Name」,「Address1」,「Address2」,「Address3」,...],並且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

你有'I = I - 1'在IIFE內部。你也可以使用'i - '和'j ++'。 –

+0

嗨,感謝您的快速響應!如果字符串不匹配,我只想減少計數器(即If語句返回False)。我怎樣才能讓i = i-1(或i--)在Else之外? – user7540600

+0

你在'(函數(i){'聲明中隱藏了'i'的範圍。 – Sunshine

回答

4

您在使用IIFEfor -loop到您傳遞的索引。 看起來這是爲了防止修改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爲簡潔)的那種模式的一個例子:

.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

我已經看過承諾,但沒有理解他們,只知道使用「.then」在我的任何代碼被調用之前,阻止了我的計數器變量遞增。出於類似的原因,我包裝了IIFE(我只知道它是一個「關閉」,因此誤解了第一個響應),因爲輸出到控制檯給了我一個不正確的值,沒有它(雖然它工作) – user7540600