将方括号表示法转换为对象

Rie*_*u͢s 2 javascript object

我有一个包含序列化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的支持。

Nin*_*olz 6

您可以通过行走给定的对象来分割路径并减少路径。如果不存在对象,则使用该名称创建一个新属性,稍后分配值并删除拆分的属性。

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)