快速Javascript字符串替换
嘿,有这么多天才 这适用于需要接受数据作为数组数组并使用格式字符串(或正则表达式)转换数据的自动完成插件。格式字符串可以是任何格式快速Javascript字符串替换,javascript,regex,autocomplete,replace,Javascript,Regex,Autocomplete,Replace,嘿,有这么多天才 这适用于需要接受数据作为数组数组并使用格式字符串(或正则表达式)转换数据的自动完成插件。格式字符串可以是任何格式 var dataArray = [ ["data1-1", "data1-2", "data1-3"], ["data2-1", "data2-2", "data2-3"],... ]; var format = "<li>{0} <br /> -- <small> {1}, {2}</small></li>
var dataArray = [ ["data1-1", "data1-2", "data1-3"], ["data2-1", "data2-2", "data2-3"],... ];
var format = "<li>{0} <br /> -- <small> {1}, {2}</small></li>";
// alternate formats could be:
// "<li>{0}</li>"
// "<a href="{0}" title="{2}">{1} ({2})</a>"
// etc...
function fillAutocomplete(datum,format){
// do some magic here...
// return "<li>data1-1 <br /> -- <small> data1-2, data1-3</small></li>";
}
var dataArray=[[“data1-1”、“data1-2”、“data1-3”]、[“data2-1”、“data2-2”、“data2-3”]、…];
var format=“{0}
--{1},{2} ”;
//替代格式可以是:
//“{0} ”
// ""
//等等。。。
函数fillAutocomplete(基准、格式){
//在这里施展魔法。。。
//返回“data1-1
--data1-2,data1-3 ”;
}
下面的想法行得通……但我想看看是否有更快的办法
var datum = data[0],
html="<li>\{0\} <br /> -- <small> \{1\}, \{2\}</small></li>";
for(var i=0,l=datum.length;i<l;++i){
var reg = new RegExp("\\{"+i+"\\}");
html=html.replace(reg,datum[i]);
}
var数据=数据[0],
html=“\{0\}
--\{1\},\{2\} ”;
对于(var i=0,l=datum.length;i而言,虽然不太优雅,但速度会明显加快:
html = "<li>" + datum[0]
+ " <br /> -- <small> "
+ datum[1] + ", " + datum[2]
+ "</small></li>";
html=“”+数据[0]
+“
--”
+基准面[1]+“,”+基准面[2]
+“ ”;
您最初的方法是为for
循环的每次迭代创建一个新的正则表达式,这可能会很昂贵。您可以考虑创建这些表达式一次并缓存它们,但即使这样,执行正则表达式和替换格式字符串的开销仍然比简单的字符串开销大连锁
不幸的是,优雅往往是优化的第一个牺牲品。请查看John Resig,看看您是否可以将回调函数传递给myString.replace(…)
var数据=数据[0];
var html=“{0}
--{1},{2} ”;
变量模式=/\{(\d+)\}/g;
html=html.replace(模式、函数(匹配、键、值){
返回基准[键];
});
您可以传递一个要替换的函数作为第二个参数。请尝试以下操作:
function fillAutocomplete(datum,format){
return format.replace(/{([0-9]+)}/g, function(match) {
return datum[match[1]];
});
}
根据需要更换的数量,这可能会更快
var datum = data[0],
html="<li>{0} <br /> -- <small> {1}, {2}</small></li>";
for(var i=0,l=datum.length;i<l;++i){
html=html.split("{" + i + "}").join(datum[i]);
}
var数据=数据[0],
html=“{0}
--{1},{2} ”;
对于(var i=0,l=datum.length;i如果仍要使用HTML字符串,这应该是最快的:
html = [
"<li>", datum[0],
"<br /> -- <small>",
datum[1], ", ", datum[2],
"</small></li>"
].join("");
这就是最初的情况。我将更新我的问题以使其更清楚。我需要每个数据集的格式字符串都是动态的。啊,我记得不久前读过这篇文章。我稍后会尝试一下。非常感谢!+1。感谢这一点,我不知道你可以在替换循环期间传递一个函数来分析当前匹配。效果非常好ks!我想知道john resig的模板制作是否会更快。嗯,明天我会回复你们所有人。更新:微模板制作不会更快,除非你们进行数千次迭代。从哲学上讲,它可能会“更好”使用DOM,但实际上会慢很多…Jason,使用字符串会慢一些,因为它必须转换为DOM。
html = [
"<li>", datum[0],
"<br /> -- <small>",
datum[1], ", ", datum[2],
"</small></li>"
].join("");
html = document.createElement("li");
html.appendChild(document.createTextNode(datum[0]));
html.appendChild(document.createElement("br"));
html.appendChild(document.createTextNode(" -- "));
html.appendChild(document.createElement("small"))
.appendChild(document.createTextNode(datum[1] + ", " + datum[2]));