js解析php格式的表单到json对象

简介: /** * JsonParse * Created by usher.yue. * User: usher.yue * Date: 17/9/7 * Time: 13:50 * 心怀教育梦-烟台网格软件技术有限公司 */class JsonConvert {...
/**
 * JsonParse
 *  Created by usher.yue.
 * User: usher.yue
 * Date: 17/9/7
 * Time: 13:50
 * 心怀教育梦-烟台网格软件技术有限公司
 */

class JsonConvert {
    /**
     *是否可合并 去除特殊类型和 日期类型
     * @param value
     * @returns {boolean}
     * @private
     */
    _mergeable(value) {
        var stringValue = Object.prototype.toString.call(value);
        return (!!value && typeof value === 'object') && ( stringValue !== '[object RegExp]'
            && stringValue !== '[object Date]');
    };

    /**
     * 是否有必要合并
     * @param value
     * @param args
     * @returns {*}
     */
    _cloneIfNecessary(value, args) {
        var clone = args && args.clone === true;
        return (clone && _mergeable(value)) ? _deepMerge(Array.isArray(value) ? [] : {}, value, args) : value
    }

    /**
     * 数组深度合并
     * @param target
     * @param source
     * @param args
     * @returns {Array.<T>|string|Blob|ArrayBuffer}
     * @private
     */
    _arrayMerge(target, source, args) {
        var destination = target.slice();
        source.forEach(function (e, i) {
            var ctx = this;
            if (typeof destination[i] === 'undefined') {
                destination[i] = ctx._cloneIfNecessary(e, args);
            } else if (ctx._mergeable(e)) {
                destination[i] = ctx._deepMerge(target[i], e, args);
            } else if (target.indexOf(e) === -1) {
                destination.push(ctx._cloneIfNecessary(e, args));
            }
        }, this);
        return destination
    }

    /**
     *深度合并对象
     * @param target
     * @param source
     * @param args
     * @returns {{}}
     * @private
     */
    _mergeObject(target, source, args) {
        var destination = {};
        var ctx = this;
        if (this._mergeable(target)) {
            Object.keys(target).forEach(function (key) {
                destination[key] = ctx._cloneIfNecessary(target[key], args);
            });
        }
        Object.keys(source).forEach(function (key) {
            if (!ctx._mergeable(source[key]) || !target[key]) {
                destination[key] = ctx._cloneIfNecessary(source[key], args);
            } else {
                destination[key] = ctx._deepMerge(target[key], source[key], args);
            }
        });
        return destination
    }

    /**
     * 深度合并, 可自定义合并函数
     * @param target
     * @param source
     * @param args
     * @returns {*}
     * @private
     */
    _deepMerge(target, source, args) {
        var sourceIsArray = Array.isArray(source);
        var targetIsArray = Array.isArray(target);
        //默认深度合并数组
        var options = args || {arrayMerge: this._arrayMerge};
        //判断是否是一个对象避免浪费时间
        var sourceAndTargetTypesMatch = (sourceIsArray === targetIsArray);
        if (!sourceAndTargetTypesMatch) {
            return this._cloneIfNecessary(source, args)
        } else if (sourceIsArray) {
            return (options.arrayMerge || this._arrayMerge).call(this, target, source, args)
        } else {
            return this._mergeObject(target, source, args)
        }
    }

    /**
     * 必须两个参数
     * @param array
     * @param args
     * @returns {*}
     * @private
     */
    _merge(array, args) {
        if (!Array.isArray(array) || array.length < 2) {
            return false;
        }
        var ctx = this;
        //顺序执行deep merge
        return array.reduce(function (prev, next) {
            return ctx._deepMerge(prev, next, args)
        })
    };

    /**
     * json parser
     * @param obj
     * @param keyList
     * @param deepVal
     * @returns {*}
     * @private
     */
    _parseToJson(obj, keyList, deepVal) {
        let retObj = null;
        if (!keyList) {
            let re = /([_a-zA-Z]\w+|\[\]|\[[0-9]+\]|\[[_a-zA-Z]\w*\])/g;
            let combineArr = [];
            for (var key in obj) {
                retObj = {};
                //解析key
                let matchSubKey = re[Symbol.match](key);
                let indexMatch = /^\[([0-9]+)\]$/.exec(matchSubKey[1]);
                let noneIndexMatch = /^\[\]$/.exec(matchSubKey[1]);
                let objectMatch = /^\[([a-zA-Z_]\w+)\]$/.exec(matchSubKey[1]);
                if (indexMatch) {
                    retObj[matchSubKey[0]] = [];
                } else if (noneIndexMatch) {
                    retObj[matchSubKey[0]] = [];
                } else if (objectMatch) {
                    retObj[matchSubKey[0]] = {};
                }
                retObj[matchSubKey[0]] = this._parseToJson(null, matchSubKey.slice(1), obj[key]);
                combineArr.push(retObj);
            }
            return this._merge(combineArr);
        } else {
            if (keyList.length > 1) {
                let indexMatch = /^\[([0-9]+)\]$/.exec(keyList[0]);
                let noneIndexMatch = /^\[\]$/.exec(keyList[0]);
                let objectMatch = /^\[([a-zA-Z_]\w+)\]$/.exec(keyList[0]);
                if (indexMatch) {
                    retObj = [];
                    retObj[indexMatch[1]] = this._parseToJson(null, keyList.slice(1), deepVal);
                } else if (noneIndexMatch) {
                    retObj = [];
                    retObj[noneIndexMatch[1]] = [];
                    retObj.push(this._parseToJson(null, keyList.slice(1), deepVal));
                } else if (objectMatch) {
                    retObj = {};
                    retObj[objectMatch[1]] = {};
                    retObj[objectMatch[1]] = this._parseToJson(null, keyList.slice(1), deepVal);
                }
            } else if (keyList.length == 1) {
                let indexMatch = /^\[([0-9]+)\]$/.exec(keyList[0]);
                let noneIndexMatch = /^\[\]$/.exec(keyList[0]);
                let objectMatch = /^\[([a-zA-Z_]\w+)\]$/.exec(keyList[0]);
                if (indexMatch) {
                    retObj = [];
                    retObj[indexMatch[1]] = deepVal;
                } else if (noneIndexMatch) {
                    retObj = [];
                    retObj.push(deepVal);
                } else if (objectMatch) {
                    retObj[objectMatch[1]] = deepVal;
                }
            }
        }
        return retObj;
    }

    /**
     * type
     * @param o
     * @returns {*}
     * @private
     */
    _type(o) {
        return Object.prototype.toString.call(o);
    }

    /**
     * 转换
     * @param obj
     * @returns {*}
     */
    parse(obj) {
        return this._parseToJson(obj);
    }

    /**
     * 转换
     * @param obj
     * @returns {*}
     */
    stringify(obj) {
        return JSON.stringify(this._parseToJson(obj));
    }
}


var obj = {
    'data[0][classid][0]': '1000150097620084286',
    'data[0][create_time][0]': '1504692288',
    'data[0][kcid][0]': '1033150427887550927',
    'data[0][schoolid][0]': '1033144479144228284',
    'data[0][type][0]': '2',
    'data[0][uid][0]': '1034145308280458231',
    'data[0][zyid][0]': '1000150235157063544',
    'data[0][zytype][0]': 'homework-exercise',

    'data[1][classid][0]': '10001500976200842861',
    'data[1][create_time][0]': '1504692288',
    'data[1][kcid][0]': '1033150427887550927',
    'data[1][schoolid][0]': '1033144479144228284',
    'data[1][type][0]': '2',
    'data[1][uid][0]': '1034145308280458231',
    'data[1][zyid][0]': '1000150235157063544',
    'data[1][zytype][0]': 'homework-exercise',
    //
    'data[2][classid][]': '10001500976200842861',
    'data[2][create_time][]': '1504692288',
    'data[2][kcid][]': '1033150427887550927',
    'data[2][schoolid][]': '1033144479144228284',
    'data[2][type][]': '2',
    'data[2][uid][]': '1034145308280458231',
    'data[2][zyid][]': '1000150235157063544',
    'data[2][zytype][]': 'homework-exercise',

    'data[3][classid][]': '10001500976200842861',
    'data[3][create_time][]': '1504692288',
    'data[3][kcid][]': '1033150427887550927',
    'data[3][schoolid][]': '1033144479144228284',
    'data[3][type][]': '2',
    'data[3][uid][]': '1034145308280458231',
    'data[3][zyid][]': '1000150235157063544',
    'data[3][zytype][]': 'homework-exercise',

    'data[3][classid][]': '10001500976200842861',
    'data[3][create_time][]': '1504692288',
    'data[3][kcid][]': '1033150427887550927',
    'data[3][schoolid][]': '1033144479144228284',
    'data[3][type][]': '2',
    'data[3][uid][]': '1034145308280458231',
    'data[3][zyid][]': '1000150235157063544',
    'data[3][zytype][]': 'homework-exercise'
};


let json = new JsonConvert();
console.log(json.parse(obj));
console.log(json.stringify(obj))
目录
相关文章
|
JavaScript 前端开发
如何在 JavaScript 中使用 __proto__ 实现对象的继承?
使用`__proto__`实现对象继承时需要注意原型链的完整性和属性方法的正确继承,避免出现意外的行为和错误。同时,在现代JavaScript中,也可以使用`class`和`extends`关键字来实现更简洁和直观的继承语法,但理解基于`__proto__`的继承方式对于深入理解JavaScript的面向对象编程和原型链机制仍然具有重要意义。
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
393 67
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
493 23
|
JSON 前端开发 JavaScript
JavaScript中对象的数据拷贝
本文介绍了JavaScript中对象数据拷贝的问题及解决方案。作者首先解释了对象赋值时地址共享导致的值同步变化现象,随后提供了五种解决方法:手动复制、`Object.assign`、扩展运算符、`JSON.stringify`与`JSON.parse`组合以及自定义深拷贝函数。每种方法都有其适用场景和局限性,文章最后鼓励读者关注作者以获取更多前端知识分享。
391 1
JavaScript中对象的数据拷贝
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
ractive.js联系表单动画效果源码
一款ractive.js联系表单动画效果,很有创意的发送邮件、联系内容等表单,基于ractive.js实现的动画效果,以发送信件的方式。
245 1

推荐镜像

更多
  • DNS