我有一个包含序列化HTMLFormElement(二维)的预格式化属性名称的对象:
var plain = {
id: 1,
'items[A][Z]': 2,
'items[B]': false,
'items[C][][A]': 1
}
Run Code Online (Sandbox Code Playgroud)
我想通过创建相应的子对象来转换对象:
var result = {
id: 1,
items: {
A: {Z:2},
B: false,
C: [ {A:1} ]
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这是一种常见做法 - 但我找不到有关该主题的更多资源。plain类似的东西通常如何称呼以及转换为 的最佳方式是什么result?
编辑:我已经用Array. 这个好像有关系,也得到了body-parserexpress的支持。
您可以通过行走给定的对象来分割路径并减少路径。如果不存在对象,则使用该名称创建一个新属性,稍后分配值并删除拆分的属性。
var plain = { id: 1, 'items[A][Z]': 2, 'items[B]': false };
Object.keys(plain).forEach(function (k) {
var path = k.replace(/\[/g, '.').replace(/\]/g, '').split('.'),
last = path.pop();
if (path.length) {
path.reduce(function (o, p) {
return o[p] = o[p] || {};
}, plain)[last] = plain[k];
delete plain[k];
}
});
console.log(plain);Run Code Online (Sandbox Code Playgroud)
ES6
var plain = { id: 1, 'items[A][Z]': 2, 'items[B]': false };
Object.keys(plain).forEach(k => {
var path = k.replace(/\[/g, '.').replace(/\]/g, '').split('.'),
last = path.pop();
if (path.length) {
path.reduce((o, p) => o[p] = o[p] || {}, plain)[last] = plain[k];
delete plain[k];
}
});
console.log(plain);Run Code Online (Sandbox Code Playgroud)