首页 > js实现一个config函数,让他能链式取值和赋值

js实现一个config函数,让他能链式取值和赋值

目前取值我已经实现了

 var conf = {
        WIN_SIZE:{x:100,y:200}
    };
   function config(k,v,_default){
       var deep = k.split('.');
       var _tmp = config;
       _.each(deep,function(k){
           if(k in _tmp){
               _tmp = _tmp[k];
           }else{
               throw '没有发现指定配置项,CONFIG->'+ deep.join('.');
               _tmp = _default;
           }
       });
       return _tmp;

   }

现在已经可以用config('WIN_SIZE.x')取值了,请问如何做到 config('WIN_SIZE.x',0)来赋值conf?

注:这个conf的深度是不确定的,如使用 config('a.b.c.d.e.f.g',100),可以给a['b']['c']['d']['e']['f']['g'] = 100




使用jquery中的$.extend,在传入的参数中,如果默认配置中有这个选项,则进行覆盖,否则传入一个新的选项;如果没有传入,则依然保留默认配置。

var conf = {
    win:{x:100, y:200}
}

function config(obj){
    return $.extend({}, conf, obj);
}

config({win:{x:200}, name:'wenzi'}); // {win:{x:200, y:200}, name:'wenzi'}

先说一下,由于 _tmp = _default 之前 throw 了,所以这句和后面的都不会执行。这里逻辑你自己考虑,我下面只解决了“设置”的问题。

var conf = {
    WIN_SIZE: {
        x: 100,
        y: 200
    }
};

function config(k, v, _default) {
    var deep = k.split('.');
    var _tmp = conf;

    if (typeof v === "undefined") {
        deep.forEach(function(k) {
            if (k in _tmp) {
                _tmp = _tmp[k];
            } else {
                throw '没有发现指定配置项,CONFIG->' + deep.join('.');
                _tmp = _default;
            }
        });
        return _tmp;
    } else {
        var last = deep.splice(deep.length - 1);
        deep.forEach(function(k) {
            _tmp = _tmp[k] = _tmp[k] || {};
        });
        _tmp[last[0]] = v || _default || v;
    }
}
config("a.b.c.d.e.f.g", "hello")
// {"WIN_SIZE":{"x":100,"y":200},"a":{"b":{"c":{"d":{"e":{"f":{"g":"hello"}}}}}}}

根据arguments.length来判断get or set

http://www.w3school.com.cn/js/pro_js_functions_arguments_object.asp


之前在某项目中写的代码,获取对你有用。

var get = function ( o, key ){
        if( !key ) return o;
        var keys = key.split('/'), k = keys.shift();
        return keys.length ? get(o[k],keys.join('/')) : o[k];
    }
var set = function( o, key, value, _native){
        var keys = key.split ? key.split('/'): [key], 
            k = keys.pop(), 
            vArr = ( _native || !(value.split) ) ? value : value.split(/[,;]+/).map(function(v){
            var t = Number(v);
            return isNaN(t) ? v : t; 
        }), p , tar;

        try{
            tar = get( o, key );
            p = get( o, keys.join('/') );
        }catch(e){
            console.error(e);
            console.log( key );
            console.log( keys );
        }
        p[ k ] = $.isArray(tar) ? vArr : value;
        if( typeof tar === 'number' ){
            p[k] = Number(value) || 0
        }
    }
【热门文章】
【热门文章】