对数据进行增删查改操作。这是一种风格,但不唯一。此处侧重于函数编程。
//CURD-C-增加
function addNs(nsObj, nsStr) {
var parts = nsStr.split("."),
parent = nsObj;
parts.forEach(function(val, key, arr) {
if(typeof parent[val] === "undefined") parent[val] = {};
parent = parent[val];
});
return parent;
}
//usage:
addNs({},'state.user.id')
//CURD-R-读取
function getNsVal(nsObj, nsStr, def) {
var result = nsObj || {};
(nsStr || '').split('.').forEach(function(key) {
if(key && (typeof result !== 'undefined')) {
result = result[key];
}
});
// 未定义:默认取值
if(typeof result === 'undefined') {
return def;
}
// 已定义已有取值
else {
return result;
}
}
//usage:
getNsVal({},'state.user.id','ymc')
getNsVal({},'state.user.id')
//CURD-U-更新
function setNsVal(nsObj, path, value) {
if(typeof value === 'undefined') {
nsObj = path;
}
//
else {
path = String(path || '').trim();
if(path) {
var paths = path.split('.'),
last = paths.pop(),
data = nsObj || {};
// 获取上一级命名空间取值
paths.forEach(function(key) {
var type = typeof data[key];
// 获取
if(type === 'object') {
data = data[key];
}
//
else if(type === 'undefined') {
data = data[key] = {};
}
// 出错
else {
console.log('forbidden to set property[' + key + '] of [' + type + '] data');
}
});
// 设置属性取值
data[last] = value;
}
}
return this;
}
//usage:
setNsVal({},'state.user.id','ymc')
setNsVal({},'state.user.id')
//CURD-D-删除
function delNsVal(nsObj, path) {
var data, //数据作用域
last, //最后一级命名空间
paths, //
key,
res;
// 字符串化
path = String(path || '').trim();
if(!path) return res = false;
paths = path.split('.');
data = nsObj;
last = paths.pop();
// 获取上级
for(var i = 0, len = paths.length; i < len; i++) {
key = paths[i];
// 存在取值时:
if(typeof data[key] === 'object') {
data = data[key];
}
// 没有取值时:返回
else {
return res = false;
}
}
// 删除
if(typeof data[last] !== 'undefined') {
delete data[last];
return res = true;
}
return res = false;
}
//usage:
delNsVal({},'state.user.id')
//合并对象-覆盖模式
function mergeObj() {
// 存储参数
var args = arguments;
if(args.length < 2) return;
// 复制对象
var temp = cloneObj(args[0]);
// 合并对象
for(var n = 1; n < args.length; n++) {
for(var i in args[n]) {
// 普通模式
//if(args[n].hasOwnProperty(i) && (!temp.hasOwnProperty(i))) temp[i] = args[n][i];
// 覆盖模式
if(args[n].hasOwnProperty(i)) {
temp[i] = args[n][i];
}
}
}
return temp;
}
//复制对象-深复制
function cloneObj(oldObj) {
if(typeof(oldObj) != 'object') return oldObj;
if(oldObj == null) return oldObj;
var newObj = {};
for(var i in oldObj) {
newObj[i] = cloneObj(oldObj[i]);
}
return newObj;
}