javascript - js实现一个config函数,让他能链式取值和赋值
PHP中文网
PHP中文网 2017-04-10 15:42:17
[JavaScript讨论组]

目前取值我已经实现了

 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



PHP中文网
PHP中文网

认证0级讲师

全部回复(4)
阿神

先说一下,由于 _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

PHPz

使用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'}
PHP中文网

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

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
        }
    }
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号