通过删除它匹配
问题描述:
一个TD每次优化了算法,我有(jQuery中)的算法:通过删除它匹配
- 接收一个
List<string>
- 搜索表进行匹配
- 做一些动作
但是我被告知有一种方法可以做这个算法,并且只能通过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;
}
});
});
谢谢,如果您需要更多信息,请询问。
答
您可以从集合中删除已经找到的元素,但这样做的成本与首先找到它一样昂贵,因此几乎没有任何收益。
您可以在文本中的元素映射到一个对象,那么你可以很容易地从文本中查找一个元素:
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
请提供样本 – Akshay
请参阅更新的代码@Akshay – hjardine
任何尝试这样做的示例,以便我可以执行并运行一些测试。 – Akshay