2010-12-14 52 views
1

寻找另一只眼做出如下的JavaScript更有效率。更高效的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: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" 
     } 
    } 
}; 

扩展ExtJS的JSONReader处理键深度高于2在createAccessor方法。想知道是否有办法让代码更有效率?下面的函数将被称为function(testing, "com:klistret:cmdb:ci:pojo:[email protected]"),其中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]; 
     }; 
    }; 
}() 
+0

为什么你的代码扫描转换expr来串每两次循环,然后调用失败子之前将其转换为字符串?不能将字符串强制转移到循环之外吗?理想情况下,也在内部功能之外。 – 2010-12-14 23:26:13

回答

1

这就是我使用的。我只允许标注点,记:

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; 
     } 
     } 
    }; 
    }() 
}); 
+0

工作完美....感谢提示(更清洁的代码....易于阅读) – 2010-12-15 20:13:40

1

一个基本的优化将避免与search扫描线的两倍,这是非常缓慢的。

你能做的最好是更换所有的字符串扫描和子萃取单一呼叫expr.split('.'),这将支持形式aaa.bbb.ccc.ddd的存取,并把它们变成像['aaa','bbb','ccc','ddd']数组。您似乎支持的另外两个字符([])不起作用。

或者,您可以对整个字符串进行/[^\].[]+/g的初始匹配,并保留匹配以获取类似的数组,但这可能会比以前的解决方案慢。