2015-09-04 209 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