将方括号符号转换为对象



我有一个包含序列化HTMLFormElement(二维)的预格式化属性名的对象:

var plain = {
    id: 1,
    'items[A][Z]': 2,
    'items[B]': false,
    'items[C][][A]': 1
}

我想通过创建相应的子对象来转换对象:

var result = {
    id: 1,
    items: {
        A: {Z:2},
        B: false,
        C: [ {A:1} ]
    }
}

据我所知,这是一种常见的做法,但我找不到更多关于这个主题的资源。这样的东西通常被称为什么?将plain转化为result的最佳方法是什么?

编辑:我已经用Array更新了示例。这似乎与express的body-parser相关,并且也得到了支持。

您可以通过遍历给定对象来分割路径并减少路径。如果对象不存在,创建一个新的属性,然后赋值并删除拆分后的属性。

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);

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);

您可以这样使用reduce()filter()

var plain = {
  id: 1,
  'items[A][Z]': 2,
  'items[B]': false
}
var obj = {}
var result = Object.keys(plain).reduce(function(r, e) {
  if (e.match(/[(.*?)]/gi)) {
    var keys = e.split(/[(.*?)]/gi).filter(e => e != '');
    keys.reduce(function(a, b, i) {
      return (i != keys.length - 1) ? a[b] || (a[b] = {}) : a[b] = plain[e];
    }, obj)
  } else {
    obj[e] = plain[e];
  }
  return r;
}, obj)
console.log(result)

最新更新