2015-09-04 101 views
0

一個TD每次優化了算法,我有(jQuery中)的算法:通過刪除它匹配

  1. 接收一個List<string>
  2. 搜索表進行匹配
  3. 做一些動作

但是我被告知有一種方法可以做這個算法,並且只能通過td搜索沒有匹配的(或者更有可能不搜索那些有搜索的)。或者任何其他想法來優化算法。

if (!jQuery.isEmptyObject(data)) { 
    $td = $('#Table td'); 
    $.each(data.StringList, function (index, val) { 
     $td.each(function() { 
      if ($(this).text() === val) { 
       $(this).closest(".ClassA").addClass('ClassB') 
       $(".ClassB").find(".ClassC").removeClass('ClassC').addClass('ClassD'); 

       // Maybe something like $(td).skip($(this)) 
       return false; 
      } 
     }); 
    }); 

謝謝,如果您需要更多信息,請詢問。

+0

請提供樣本 – Akshay

+0

請參閱更新的代碼@Akshay – hjardine

+0

任何嘗試這樣做的示例,以便我可以執行並運行一些測試。 – Akshay

回答

2

您可以從集合中刪除已經找到的元素,但這樣做的成本與首先找到它一樣昂貴,因此幾乎沒有任何收益。

您可以在文本中的元素映射到一個對象,那麼你可以很容易地從文本中查找一個元素:

if (!jQuery.isEmptyObject(data)) { 
    $td = $('#Table td'); 
    var map = {}; 
    $td.each(function() { 
    var t = $(this); 
    map[t.text()] = t; 
    }); 
    $.each(data.StringList, function (index, val) { 
    if (val in map) { 
     map[val].closest(".ClassA").addClass('ClassB'); 
     $(".ClassB").find(".ClassC").removeClass('ClassC').addClass('ClassD'); 
    } 
    }); 
}); 

這將有一個O(N + M)的性能,而不是O( n * m個)。

如果迴路第二行是試圖發現得了類ClassB在第一線的元素,那麼你應該把它們連起來使用的參考,你已經擁有的元素:

 map[val].closest(".ClassA").addClass('ClassB') 
     .find(".ClassC").removeClass('ClassC').addClass('ClassD'); 
+0

一段令人難以置信的代碼將等待時間從15秒縮短到0.5秒,3000%的優化,認爲值得+1 – hjardine