【问题标题】:Search object with namespace / key使用命名空间/键搜索对象
【发布时间】:2013-07-08 05:04:37
【问题描述】:

我正在尝试编写一个函数,它可以在 JavaScript 对象中查找名称空间和值并返回键。

将此数据映像:

var o = {

    map: {
        lat : -33.86749,
        lng : 151.20699,
        zoom : 12
    },

    filters : {
        animals : {
            dogs: {
                myDog : 'fido'
            }
        }
    }
};

function get(namespace, key){
    //TODO
}

get('filters.animals.dogs', 'myDog')

您将如何构建一个动态执行此操作的函数 - 无论命名空间的深度如何?

这个函数有点接近,只是它修改了我们不想要的原始对象:

var get = function(obj, namespace, key, value) {

    var parts = namespace.split('.');

    for(var i = 0; i < parts.length; i++) {
        if(typeof obj[parts[i]] == 'undefined'){
            obj[parts[i]] = {};
        }

        obj = obj[parts[i]];
    }

    return obj[key] = value;
};

疯狂的原因是我无法暴露对象。它必须保持私有并且公共方法必须输出结果。

【问题讨论】:

    标签: javascript object namespaces


    【解决方案1】:

    试试这个。

    function get(namespace, key) {
        var parts = namespace.split('.'),
            i = 0,
            l = parts.length,
            obj = o;
        while ( i < l ) {
            obj = obj[parts[i]];
            if ( ! obj ) break;
            i++; 
        }
        return obj && obj[key] ? obj[key] : null;
    }
    

    【讨论】:

      【解决方案2】:

      我用工作代码创建了一个小提琴。希望对您有所帮助。

      http://jsfiddle.net/RdhJF/2/

      var o = {
      
          map: {
              lat : -33.86749,
              lng : 151.20699,
              zoom : 12
          },
      
          filters : {
              animals : {
                  dogs: {
                      myDog : 'fido'
                  }
              }
          }
      };
      
      
      
      
      function get(obj, namespace) 
      {
          var parts = namespace.split('.');
      
          if(parts.length==0)
              return -1;
      
      
          var previousValue = obj;
      
          for(var i = 0; i < parts.length; i++) 
          {
              if(typeof previousValue[parts[i]] == 'undefined')
                  return -1;
              else
                  previousValue = previousValue[parts[i]];
      
          }
      
          return previousValue;
      }
      
      var myValue= get(o,'filters.animals.dogs.myDog');
      alert(myValue);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多