localstorage模拟数据库的简化版本

使用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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值