使用localstorage模拟一个数据库的操作(简化版本)
localstorage的每一项就是模拟的每一张二维表
目前仅支持CMD规范,VUE等前端框架可以自己对下面的代码做一些修改.
;(function(window){
//一些常量
var CONSTPARAMS = {
ZERO:0,
MINUS1:-1,
POSITIVE1:1,
MYTRUE:true,
MYFALSE:false,
MYNULL:null,
LTableCANROWDELETE:false, //表中记录是否可以删除
LTableCANROWUPDATE:false //表中记录是否可以更新
};
//JSON字符串转化为对象
function _JSON2Obj(jsonStr) {
if(typeof jsonStr == "object"){
console.error("can not translate Object to Object in _JSON2Obj function");
return null;
}
return window.JSON.parse(jsonStr);
}
//JSON对象转化为JSON字符串
function _Obj2JSON(obj) {
if(typeof jsonStr == "string"){
console.error("can not translate string to string in _Obj2JSON function");
return null;
}
return window.JSON.stringify(obj);
}
//查询localstorage中有没有虚拟的表名
function _hasTable(tableName) {
if(window.localStorage){
if(window.localStorage.getItem(tableName)){
return CONSTPARAMS.MYTRUE;
}else{
window.console.error(tableName + "is not exist");
return CONSTPARAMS.MYFALSE;
}
}else{
window.console.error("Your browser doesn't support localStorage");
return CONSTPARAMS.MYFALSE;
}
}
//从localstorage中获取值
function _getItem(tableName) {
if(tableName){
if(_hasTable(tableName)){
return _JSON2Obj(window.localStorage.getItem(tableName));
}
}else{
console.error(tableName+"empty");
return CONSTPARAMS.MYNULL;
}
}
//向localstorage中存入值
function _setItem(tableData, tableName) {
if(tableName){
if(tableData){
window.localStorage.setItem(tableName,_Obj2JSON(tableData));
return CONSTPARAMS.POSITIVE1;
}else{
console.error(tableData+"null");
return CONSTPARAMS.MINUS1;
}
}else{
console.error(tableName+"empty");
return CONSTPARAMS.MINUS1;
}
}
//向添加的每一个字段中存入其他字段,以备后期操作,如可删除标记,可更新标记
function _addParams(newObj) {
var result = true;
if(!newObj.hasOwnProperty("LTableCANROWDELETE")){
newObj["LTableCANROWDELETE"] = CONSTPARAMS.LTableCANROWDELETE;
if(!newObj.hasOwnProperty("LTableCANROWUPDATE")){
newObj["LTableCANROWUPDATE"] = CONSTPARAMS.LTableCANROWUPDATE;
}else{
window.console.error("LTableCANROWDELETE param is conflict with LTable");
result = false;
}
}else{
window.console.error("LTableCANROWDELETE param is conflict with LTable");
result = false;
}
return result;
}
//根据主键检查表中是不是存在重复值
function _uniqueCheck(tableData,options,objData) {
var result = true;
for(var i=0;i<tableData.length;i++){
if(tableData[i][options.primaryKey] == objData[options.primaryKey]){
result = false;
break;
}
}
return result;
}
//从一个对象中提取出指定的字段值,并返回一个对象
function _getNewObjectFromObject(obj,paramsArr) {
var newObject = {};
for(var item in obj){
for(var i=0;i<paramsArr.length;i++){
if(paramsArr[i] == item){
newObject[item] = obj[item];
}
}
}
return newObject;
}
//检查主键是不是存在于add方法的paramsArr字段中
function _hasPrimaryKey(paramsArr,options) {
var result = true;
var i=0;
for(;i<paramsArr.length;i++){
if(options.primaryKey == paramsArr[i]){
break;
}
}
if(i == paramsArr.length){
result = false;
}
return result;
}
//检查add方法中objData是不是存在paramsArr中的字段
function _hasParamsInDataObj(dataObj,paramsArr) {
var result = true;
for(var i=0;i<paramsArr.length;i++){
if(!dataObj.hasOwnProperty(paramsArr[i])){ //paramsArr中的所有字段在dataObj中必须存在,有一个不存在就中指程序
window.console.error(paramsArr[i] + " must in dataObj");
result = false;
break;
}
}
return result;
}
//检查函数中的参数是否存在
function _checkParamsExist() {
var result = true;
var params = arguments;
for(var i=0;i<params.length;i++){
if(typeof params[i] == 'undefined'){
result = false;
window.console.error("The function lacks some parameters");
break;
}
}
return result;
}
var LTable = {
/*
关于表格的初始化设置
*/
options:{
//默认的主键,不可重复
primaryKey:"id"
},
/**
*
* @param tableName 模拟表格的名称
* @param dataObj 增加的对象
* @param paramsArr 要添加到表中的字段
*/
add:function (tableName,dataObj,paramsArr) {
if(_hasTable(tableName)){
var tableData =_getItem(tableName);
if(paramsArr.length > 0){
if(_hasPrimaryKey(paramsArr,this.options)){
//检查dataObj是不是存在所需字段
if(_hasParamsInDataObj(dataObj,paramsArr)){
//检查重复值是否存在
if(_uniqueCheck(tableData,this.options,dataObj)){
var newObj = _getNewObjectFromObject(dataObj,paramsArr);
tableData.push(newObj);
_setItem(tableData,tableName);
return CONSTPARAMS.POSITIVE1;
}else{
//存在重复值
window.console.error("There are duplicate values in the table primaryKey : "+dataObj[this.options.primaryKey]);
return CONSTPARAMS.MINUS1;
}
}else{
//dataObj中有没存在的值
return CONSTPARAMS.MINUS1;
}
}else{
console.error("paramsArr must has primaryKey");
return CONSTPARAMS.MINUS1;
}
}else{
console.error("paramsArr must has primaryKey");
return CONSTPARAMS.MINUS1;
}
}else{
return CONSTPARAMS.MINUS1;
}
},
/**
*
* @param tableName 模拟表格的名称
* @param whereObj 删除条件,如需全部删除,请传入空对象
*/
delete:function (tableName,whereObj) {
if(!_checkParamsExist(tableName,whereObj)){
return CONSTPARAMS.MINUS1;
}
if(_hasTable(tableName)){
var tableData =_getItem(tableName);
var result = []; //另外一个新的数组
var row = null;
var deleteFlag = true;
var deleteNum = 0;
for (var i=0;i<tableData.length;i++){
row = tableData[i];
for(var item in whereObj){ //查询whereObj中的值和tableData中的值是否一样
if(row.hasOwnProperty(item)){
if(whereObj[item] != row[item]){
deleteFlag = false;
break;
}
}else{
window.console.error(item + " is not exist in "+tableName+",please update your whereObj");
return CONSTPARAMS.MINUS1;
}
}
//不可以执行删除
if(!deleteFlag){
result.push(row);
}else{
deleteNum++;
}
row = null;
deleteFlag = true;
}
if(deleteNum > 0){ //有需要删除的数据
//将数据存入进去localstorage
_setItem(result,tableName);
return deleteNum;
}else{
return CONSTPARAMS.MINUS1;
}
}else{
return CONSTPARAMS.MINUS1;
}
},
/**
*
* @param tableName 模拟表格的名称
* @param whereObj 更新条件
* @param dataObj 更新数据
*/
update:function (tableName,dataObj,whereObj) {
if(!_checkParamsExist(tableName,dataObj,whereObj)){
return CONSTPARAMS.MINUS1;
}
if(_hasTable(tableName)){
var tableData =_getItem(tableName);
var row = null;
var updateFlag = true;
var updateNum = 0;
for (var i=0;i<tableData.length;i++){
row = tableData[i];
for(var item in whereObj){ //查询whereObj中的值和tableData中的值是否一样
if(row.hasOwnProperty(item)){
if(whereObj[item] != row[item]){
updateFlag = false;
break;
}
}else{
window.console.error(item + " is not exist in table,please update your whereObj");
return CONSTPARAMS.MINUS1;
}
}
//执行更新
if(updateFlag){
for(var item in row){ //查询whereObj中的值和tableData中的值是否一样
//主键不可更新
if(item != this.options.primaryKey){
row[item] = dataObj[item];
}
}
tableData[i] = row;
updateNum++;
}
row = null;
updateFlag = true;
}
if(updateNum > 0){
//将数据存入进去localstorage
_setItem(tableData,tableName);
return updateNum;
}else{
return CONSTPARAMS.MINUS1;
}
}else{
return CONSTPARAMS.MINUS1;
}
},
/**
*
* @param tableName 模拟表格的名称
* @param whereObj 查询条件
*/
select:function (tableName,whereObj) {
if(!_checkParamsExist(tableName,whereObj)){
return CONSTPARAMS.MINUS1;
}
var result = [];
if(_hasTable(tableName)){
var tableData =_getItem(tableName);
var row = null;
var selectFlag = true;
for (var i=0;i<tableData.length;i++){
row = tableData[i];
for(var item in whereObj){ //查询whereObj中的值和tableData中的值是否一样
if(row.hasOwnProperty(item)){
if(whereObj[item] != row[item]){
selectFlag = false;
break;
}
}else{
window.console.error(item + " is not exist in table,please update your whereObj");
return CONSTPARAMS.MINUS1;
}
}
if(selectFlag){
result.push(row);
}
row = null;
selectFlag = true;
}
}
return result;
},
/**
*
* @param tableName 模拟表格的名称
*/
selectAll:function (tableName) {
if(!_checkParamsExist(tableName)){
return CONSTPARAMS.MINUS1;
}
var result = [];
if(_hasTable(tableName)){
result =_getItem(tableName);
}
return result;
},
/**
*
* @param tableName 模拟表格的名称
* @param whereObj 查询条件
*/
count:function (tableName, whereObj) {
if(!_checkParamsExist(tableName,whereObj)){
return CONSTPARAMS.MINUS1;
}
var result = 0;
if(_hasTable(tableName)){
var tableData =_getItem(tableName);
var row = null;
var selectFlag = true;
for (var i=0;i<tableData.length;i++){
row = tableData[i];
for(var item in whereObj){ //查询whereObj中的值和tableData中的值是否一样
if(row.hasOwnProperty(item)){
if(whereObj[item] != row[item]){
selectFlag = false;
break;
}
}else{
window.console.error(item + " is not exist in table,please update your whereObj");
return CONSTPARAMS.MINUS1;
}
}
if(selectFlag){
result++;
}
row = null;
selectFlag = true;
}
}
return result;
},
/**
*
* @param tableName 模拟表格的名称
* @param whereObj 查询条件
* @param countParam 需要count的字段,一个字符串
*/
countByParam:function (tableName, whereObj,countParam) {
if(!_checkParamsExist(tableName,whereObj)){
return CONSTPARAMS.MINUS1;
}
var result = 0;
if(_hasTable(tableName)){
var tableData =_getItem(tableName);
var row = null;
var selectFlag = true;
for (var i=0;i<tableData.length;i++){
row = tableData[i];
for(var item in whereObj){ //查询whereObj中的值和tableData中的值是否一样
if(row.hasOwnProperty(item)){
if(whereObj[item] != row[item]){
selectFlag = false;
break;
}
}else{
window.console.error(item + " is not exist in table,please update your whereObj");
return CONSTPARAMS.MINUS1;
}
}
if(selectFlag){
result += row[countParam];
}
row = null;
selectFlag = true;
}
}
return result;
},
/**
*
* @param tableName 模拟表格的名称
*/
dropTable:function (tableName) {
if(!_checkParamsExist(tableName)){
return CONSTPARAMS.MINUS1;
}
var result = false;
if(_hasTable(tableName)){
window.localStorage.removeItem(tableName);
result = true;
}else{
result = false;
}
},
/**
*
* @param tableName 模拟表格的名称
* @returns {*}
*/
createTable:function (tableName) {
if(!_hasTable(tableName)){
window.localStorage.setItem(tableName,_Obj2JSON([]));
}
}
};
/*目前支持CMD规范,seajs*/
if(window.define && window.define.cmd){
window.define(function (require, exports, module) {
module.exports = LTable;
});
}else{
window.LTable = LTable;
}
})(window);