更高效的Javascript
希望从另一个角度来提高以下Javascript的效率 以下JSON由Resteasy服务生成:更高效的Javascript,javascript,extjs,performance,Javascript,Extjs,Performance,希望从另一个角度来提高以下Javascript的效率 以下JSON由Resteasy服务生成: var testing = { "com:klistret:cmdb:ci:pojo:successful":true, "com:klistret:cmdb:ci:pojo:count":1, "com:klistret:cmdb:ci:pojo:elements":{ "com:klistret:cmdb:ci:pojo:id":123, "com:kli
var testing = {
"com:klistret:cmdb:ci:pojo:successful":true,
"com:klistret:cmdb:ci:pojo:count":1,
"com:klistret:cmdb:ci:pojo:elements":{
"com:klistret:cmdb:ci:pojo:id":123,
"com:klistret:cmdb:ci:pojo:name":"Mars",
"com:klistret:cmdb:ci:pojo:type":{
"com:klistret:cmdb:ci:pojo:id":1,
"com:klistret:cmdb:ci:pojo:name":"Environment"
},
"com:klistret:cmdb:ci:pojo:configuration":{
"@www:w3:org:2001:XMLSchemainstance:type":"Environment",
"@Watermark":"past",
"com:klistret:cmdb:ci:commons:Name":"Mars"
}
}
};
在createAccessor方法中扩展Extjs JSONReader以处理大于2的键深度。想知道是否有办法使代码更高效?下面的函数将像函数一样调用(测试,“com:klistret:cmdb:ci:pojo:configuration@Watermark”)
,其中com:klistret:cmdb:ci:pojo:elements
属性是根
createAccessor : function(){
var re = /[\[\.]/;
return function(expr) {
if(Ext.isEmpty(expr)){
return Ext.emptyFn;
}
if(Ext.isFunction(expr)){
return expr;
}
# THIS FUNCTION I WANT TO BE EFFICIENT
return function(obj){
while (String(expr).search(re) !== -1) {
var i = String(expr).search(re);
var key = expr.substring(0, i);
if (obj.hasOwnProperty(key)) {
obj = obj[key];
}
expr = expr.substring(i+1, expr.length);
}
return obj[expr];
};
};
}()
一个基本的优化方法是避免使用
搜索
扫描字符串两次,这相当慢
您所能做的最好的事情就是用对expr.split('.')
的单个调用来替换所有字符串扫描和子字符串提取,这将支持aaa.bbb.ccc.ddd形式的访问器,并将它们转换成一个数组,如['aaa','bbb','ccc','ddd']
。您似乎支持的另外两个字符([
和]
)不起作用
或者,您可以在整个字符串上对/[^\].[]+/g
进行初始匹配,并保留匹配以获得类似的数组,但这可能比以前的解决方案慢。这就是我使用的方法。我只允许点批注,注意:
Ext.override(Ext.data.JsonReader, {
createAccessor: function() {
return function(expr) {
if (Ext.isEmpty(expr)) {
return Ext.emptyFn;
} else if (Ext.isFunction(expr)) {
return expr;
} else {
return function(obj) {
var parts = (expr || '').split('.'),
result = obj,
part,
match;
while (parts.length > 0 && result) {
part = parts.shift();
match = part.match(/^(.+?)(\[(\d+)\])?$/);
result = result[match[1]];
if (result && match[3]) {
result = result[match[3]];
}
}
return result;
}
}
};
}()
});
为什么每次循环代码扫描将expr转换为字符串两次,然后在调用子字符串之前将其转换为字符串失败?字符串强制不能完全移出循环吗?理想情况下,也要在内部功能之外。