2010-12-14 73 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的初始匹配,並保留匹配以獲取類似的數組,但這可能會比以前的解決方案慢。