2014-09-02 25 views
2

我有一張巨大的表格(最多10 000行)。我必須經歷每一行,計算一些數據並將它寫在每行的兩個單元格中。使用jQuery讀取,計算和寫入巨大數據表中的數據

我做類似的東西:

$('#table tbody').find('tr:visible').each(function() { 
     var tr = $(this); 
     var a = tr.children('.cell3').text(); 
     tr.children('.cell4').html(xxx.calculate(parseFloat(tr.children('.cell1').text()), a, b)); 
     tr.children('.cell5').html(xxx.calculate(parseFloat(tr.children('.cell2').text()), a, b)); 
    }); 

,我看到,紋,這是大多數的時間計算過程中度過的。

  • 我試圖緩存所有兒童(VAR TDS tr.children(」。小區1,.cell2,.cell3' )),然後使用tds.get()用於檢索值。

  • 我試圖使用innerHTML JS本地方法

但我沒有顯著的改善。

你有什麼建議或看到我的代碼中的東西不好?這是我能獲得的最好的嗎?

PS:細胞可以以不同的順序,所以我必須通過類名來訪問它們

+3

是什麼'xxx.calculate'嗎? – Jivings 2014-09-02 14:46:23

+0

xxx.calculate只是根據其他計算值(即b)對單元格值進行一些操作,但我不能多說一些,因爲它是一個私人項目。 – Daniele 2014-09-08 12:16:13

回答

0

10000行很多遍歷,對於一些增益,嘗試使用盡可能多的本地方法。

幾個簡單建議,不知道這是否會造成巨大的收益,但應該是比較快:

1.使用普通的for循環,與緩存長度

10000行循環是最好的測試用例來檢查$ .each和plain for循環之間的性能差異。

var items = $('#table tbody').find('tr:visible'); 

var length = items.length; 
for(var i = 0; i< length; i++) 
{ 

    var tr = $(items[i]); 
    var a = tr.children('.cell3').text(); 
     tr.children('.cell4').html(xxx.calculate(parseFloat(tr.children('.cell1').text()), a, b)); 
     tr.children('.cell5').html(xxx.calculate(parseFloat(tr.children('.cell2').text()), a, b)); 
} 

2.使用find(),而不是兒童(),檢查jsperf here

var items = $('#table tbody').find('tr:visible'); 

var length = items.length; 
for(var i = 0; i< length; i++) 
{ 

    var tr = $(items[i]); 
    var a = tr.find('.cell3').text(); 
     tr.find('.cell4').html(xxx.calculate(parseFloat(tr.find('.cell1').text()), a, b)); 
     tr.find('.cell5').html(xxx.calculate(parseFloat(tr.find('.cell2').text()), a, b)); 
}