目前取值我已经实现了
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
}
}