将formdata转换为嵌套的JSON

时间:2016-01-07 13:42:37

标签: javascript json parsing nested

我正在尝试将控制台显示(formData)转换为嵌套的JSON对象。我得到的formData是:

{
    "custom[1].a": "FIXED",
    "custom[1].b": "",
    "custom[1].c": "PROPORTIONATE",
    "custom[1].d": ""
    "custom[2].a": "FIXED2",
    "custom[2].b": "",
    "custom[2].c": "PROPORTIONATE2",
    "custom[2].d": ""
}
  I want to convert it to JSON in javascript.

"customConfiguration": [{
        "a": "PROPORTIONATE",
        "b": "",
        "c": "FIXED",
        "d": ""
    },
    {   "a": "PROPORTIONATE2",
        "b": "",
        "c": "FIXED2",
        "d": ""
}]

1 个答案:

答案 0 :(得分:1)

也许这就是你想要的。假设数字表示数组索引,而基于数字索引,则递减索引以获得基于零的结果。

  • 使用reduce迭代对象的所有键,以空对象开头

  • [替换为.[,将键分成几部分,因此[...]的字符串表示数组值,其他字符串是常用属性

  • 对右属性引用应用reduce,从第一个reduce

    的对象开始
    • 检查item是否为数组索引,如果减1,则将其设为零

    • 将属性应用于属性,或者如果下一部分是数组索引,则返回一个数组,否则返回一个对象

    • 检查密钥是否是数组中的最后一个密钥并分配值

    • 返回新对象引用

  • 返回新对象

var object = {
        'custom[1].a': 'PROPORTIONATE',
        'custom[1].b': '',
        'custom[1].c': 'FIXED',
        'custom[1].d': '',
        'custom[2].a': 'PROPORTIONATE2',
        'custom[2].b': '',
        'custom[2].c': 'FIXED2',
        'custom[2].d': ''
    },
    newObject = Object.keys(object).reduce(function (r, a) {
        a.replace('[', '.[').split('.').reduce(function (o, b, i, kk) {
            function isArrayIndex(s) { return /^\[\d+\]$/.test(s); }                
            if (isArrayIndex(b)) {
                b = b.match(/\d+/) - 1;
            }
            o[b] = o[b] || (isArrayIndex(kk[i + 1]) ? [] : {});
            if (i + 1 === kk.length) {
                o[b] = object[a];
            }
            return o[b];
        }, r);
        return r;
    }, {});

    document.write('<pre>' + JSON.stringify(newObject, 0, 4) + '</pre>');