如何使用js/vue处理formData数据,转化为json数据格式

前端传到后端的数据格式为 formData,在浏览器控制台查看到的数据为:

platform: pcweb
formData[runtime]: 0.067
formData[status]: Y
formData[code]: 200
formData[msg]: 
formData[data][0][a]: 6984
formData[data][0][b]: 1399
formData[data][0][c]: 你做饭好吃吗?
formData[data][0][d]: 0
formData[data][0][e]: 0
formData[data][0][f]: 1
formData[data][0][g][0][url]: ""
formData[data][1][a]: 6984
formData[data][1][b]: 1399
formData[data][1][c]: 你做饭好吃吗?
formData[data][1][d]: 0
formData[data][1][e]: 0
formData[data][1][f]: 1
formData[data][1][g][0][url]: ""
...

有的时候需要看传到后端的数据是否有问题,因此想自己写一个小工具,能够把 formData 格式转换为 json 格式,查了很多 formData转json 的例子,都是在请求之前使用 formData 对象进行转换。前端使用 vue+element-ui 来进行开发
尝试 1:

const formData = []
// 截取字符串
const array = str.split("\n")
// 遍历
arrayStr.forEach(function (item,index) {
    eval(item)
})

把数组元素当做是赋值语句,使用 evel() 函数去执行代码,结果因为文本信息里的下标,例如:formData[runtime],它会把 runtime 识别成一个变量,因此无法继续往下执行。

尝试 2:
有了尝试 1 的思路,就想着把大括号内的数组下标加上引号,但是依然提示有异常;

尝试 3:
后端有现成的 php 的方法,但是每次都要复制粘贴,然后打印,很不友好,仿照着用 js 的方式去写,可是自己前端的技术比较菜且 js 里没有 php &$ 这样的用法,因此也是卡在了快结束的阶段。

因此,小伙伴们有没有什么想法和思路能够让上面的文本信息转化为:

{
    "platform": "pcweb",
    "runtime": "",
    "formData":{
        "data": [
            {
                "a":1,
                "b":2
                ...
            },
            {
                "a":1,
                "b":2
                ...
            }
    }
}
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

找到了个比较完美的方法,利用 lodash 的 _.set

const result = `platform: pcwe 
formData[runtime]: 0.067
formData[status]: Y
formData[code]: 200
formData[msg]: 
formData[data][0][a]: 6984
formData[data][0][b]: 1399
formData[data][0][c]: 你做饭好吃吗?
formData[data][0][d]: 0
formData[data][0][e]: 0
formData[data][0][f]: 1
formData[data][0][g][0][url]: ""
formData[data][1][a]: 6984
formData[data][1][b]: 1399
formData[data][1][c]: 你做饭好吃吗?
formData[data][1][d]: 0
formData[data][1][e]: 0
formData[data][1][f]: 1
formData[data][1][g][0][url]: ""`.split('\n')
  .reduce(
    (r, i) => _.set(r, ...i.split(': ', 2).reduce(
        (k, v) => ([k.replace(/\[(\D+?)]/g, '.$1'), v]),
      ),
    ), {})

旧的内容 👇

效果不是很完美,数组会被显示成对象,下面那个方法来自 javascript - Convert HTML form-data to nested JSON - Stack Overflow

var object = Object.fromEntries(`platform: pcwe 
formData[runtime]: 0.067
formData[status]: Y
formData[code]: 200
formData[msg]: 
formData[data][0][a]: 6984
formData[data][0][b]: 1399
formData[data][0][c]: 你做饭好吃吗?
formData[data][0][d]: 0
formData[data][0][e]: 0
formData[data][0][f]: 1
formData[data][0][g][0][url]: ""
formData[data][1][a]: 6984
formData[data][1][b]: 1399
formData[data][1][c]: 你做饭好吃吗?
formData[data][1][d]: 0
formData[data][1][e]: 0
formData[data][1][f]: 1
formData[data][1][g][0][url]: ""`.split("\n").map(i=>i.split(': ',2)).map(([name,value])=>([name.replace(/\[(\w+?)]/g,'.$1'),value])))

// 来自 https://stackoverflow.com/questions/34656665/convert-html-form-data-to-nested-json
const result = 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;
    }, {});


console.log(result)
2年前 评论
她来听我的演唱会 (楼主) 2年前
讨论数量: 3

找到了个比较完美的方法,利用 lodash 的 _.set

const result = `platform: pcwe 
formData[runtime]: 0.067
formData[status]: Y
formData[code]: 200
formData[msg]: 
formData[data][0][a]: 6984
formData[data][0][b]: 1399
formData[data][0][c]: 你做饭好吃吗?
formData[data][0][d]: 0
formData[data][0][e]: 0
formData[data][0][f]: 1
formData[data][0][g][0][url]: ""
formData[data][1][a]: 6984
formData[data][1][b]: 1399
formData[data][1][c]: 你做饭好吃吗?
formData[data][1][d]: 0
formData[data][1][e]: 0
formData[data][1][f]: 1
formData[data][1][g][0][url]: ""`.split('\n')
  .reduce(
    (r, i) => _.set(r, ...i.split(': ', 2).reduce(
        (k, v) => ([k.replace(/\[(\D+?)]/g, '.$1'), v]),
      ),
    ), {})

旧的内容 👇

效果不是很完美,数组会被显示成对象,下面那个方法来自 javascript - Convert HTML form-data to nested JSON - Stack Overflow

var object = Object.fromEntries(`platform: pcwe 
formData[runtime]: 0.067
formData[status]: Y
formData[code]: 200
formData[msg]: 
formData[data][0][a]: 6984
formData[data][0][b]: 1399
formData[data][0][c]: 你做饭好吃吗?
formData[data][0][d]: 0
formData[data][0][e]: 0
formData[data][0][f]: 1
formData[data][0][g][0][url]: ""
formData[data][1][a]: 6984
formData[data][1][b]: 1399
formData[data][1][c]: 你做饭好吃吗?
formData[data][1][d]: 0
formData[data][1][e]: 0
formData[data][1][f]: 1
formData[data][1][g][0][url]: ""`.split("\n").map(i=>i.split(': ',2)).map(([name,value])=>([name.replace(/\[(\w+?)]/g,'.$1'),value])))

// 来自 https://stackoverflow.com/questions/34656665/convert-html-form-data-to-nested-json
const result = 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;
    }, {});


console.log(result)
2年前 评论
她来听我的演唱会 (楼主) 2年前

不用转吧,直接 调用序列化方法就好了

2年前 评论