我正在尝试将控制台显示(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": ""
}]
答案 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>');