首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更高效的Javascript

更高效的Javascript
EN

Stack Overflow用户
提问于 2010-12-14 23:14:19
回答 2查看 541关注 0票数 1

寻找另一只眼睛让下面的Javascript更有效率。

下面的JSON是由Resteasy服务生成的:

代码语言:javascript
复制
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以处理createAccessor方法中大于2的键深度。想知道是否有一种方法可以使代码更有效?下面的函数将像function(testing, "com:klistret:cmdb:ci:pojo:configuration.@Watermark")一样调用,其中com:klistret:cmdb:ci:pojo:elements属性是根。

代码语言:javascript
复制
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];
        };
    };
}()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-15 07:11:04

这就是我所使用的。我只允许点注释,注意:

代码语言:javascript
复制
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;
        }
      }
    };
  }()
});
票数 1
EN

Stack Overflow用户

发布于 2010-12-14 23:29:50

一个基本的优化是避免使用search两次扫描字符串,这是相当慢的。

最好的做法是用一个对expr.split('.')的调用替换所有的字符串扫描和子字符串提取,这将支持表单aaa.bbb.ccc.ddd的访问器,并将它们转换成像['aaa','bbb','ccc','ddd']这样的数组。您似乎支持的另外两个字符([])不起作用。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4440603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档