寻找用javascript替换字符串的最高效的方法
Searching for most performant way for string replacing with javascript
我在客户端使用c#和javascript编程我自己的自动完成文本框控件。在客户端,我想替换字符串中的字符匹配的字符用户正在搜索突出显示它。例如,如果用户正在搜索字符"blue",我想替换单词"marbuel"中的这些字母,如下所示:
mar<span style="color:#81BEF7;font-weight:bold">bue</span>l
,以便给匹配的部分另一种颜色。如果我有100-200个项目在我的自动完成,这工作得很好,但当它涉及到500或更多,它需要太多的时间。
下面的代码显示了我的方法,它执行此逻辑:
HighlightTextPart: function (text, part) {
var currentPartIndex = 0;
var partLength = part.length;
var finalString = '';
var highlightPart = '';
var bFoundPart = false;
var bFoundPartHandled = false;
var charToAdd;
for (var i = 0; i < text.length; i++) {
var myChar = text[i];
charToAdd = null;
if (!bFoundPart) {
var myCharLower = myChar.toLowerCase();
var charToCompare = part[currentPartIndex].toLowerCase();
if (charToCompare == myCharLower) {
highlightPart += myChar;
if (currentPartIndex == partLength - 1)
bFoundPart = true;
currentPartIndex++;
}
else {
currentPartIndex = 0;
highlightPart = '';
charToAdd = myChar;
}
}
else
charToAdd = myChar;
if (bFoundPart && !bFoundPartHandled) {
finalString += '<span style="color:#81BEF7;font-weight:bold">' + highlightPart + '</span>';
bFoundPartHandled = true;
}
if (charToAdd != null)
finalString += charToAdd;
}
return finalString;
},
此方法仅突出显示匹配部分的第一次出现。我这样使用它。一旦请求从服务器返回,我通过循环遍历每个条目来构建一个带有匹配条目的html UL列表,并在每个循环中调用此方法以突出显示匹配的部分。
就像我说的,对于最多100个项目,它工作得很好,但是对于500个或更多的项目来说,它太多了。
有没有办法让它快一点?也许通过使用正则表达式或其他技术?
我还考虑过使用"setTimeOut"在一个额外的函数中做它,或者可能只对项目做它,目前是可见的,因为只有几个项目是可见的,而对于其他的你必须滚动
尝试限制可见列表的大小,例如,您最多只能显示100个项目。从可用性的角度来看,甚至可以减少到只有20个项目,这样会更快。还要考虑使用类——看看它是否能提高性能。所以不用
mar<span style="color:#81BEF7;font-weight:bold">bue</span>l
你将得到这个:
mar<span class="highlight">bue</span>l
JavaScript中的字符串替换非常容易,使用String.replace()
:
function linkify(s, part)
{
return s.replace(part, function(m) {
return '<span style="color:#81BEF7;font-weight:bold">' + htmlspecialchars(m) + '</span>';
});
}
function htmlspecialchars(txt)
{
return txt.replace('<', '<')
.replace('>', '>')
.replace('"', '"')
.replace('&', '&');
}
console.log(linkify('marbuel', 'bue'));
我通过使用regex而不是我以前发布的方法解决了这个问题。我现在用下面的代码替换字符串:
return text.replace(new RegExp('(' + part + ')', 'gi'), "<span>$1</span>");
这非常快。比上面的代码快得多。自动补全功能中500个项目似乎没有问题。但有人能解释一下,为什么这比我的方法快得多或者用字符串来做。不使用正则表达式替换?我不知道。
谢谢!
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- 如何在 JavaScript 中编写高效的事件回调方法
- 使用JQuery构建选项卡,这是最高效和最有效的方法
- 用于更改列表项的内部dom元素的Javascript高效方法
- 在JavaScript中,从美元金额中提取数字的最紧凑、最高效、最可靠的方法是什么
- 使用JavaScript动态生成DOM元素的高效OOP方法
- 在JavaScript中检查字符串是否为空白(即只包含空格)的最高效方法
- 具有私有/公共方法的高效Javascript模块模式
- 寻找用javascript替换字符串的最高效的方法
- JavaScript中的高效方法
- 最高效的调用javaScript物理引擎更新循环的方法