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

时间:2016-11-13 19:14:17

标签: javascript object

我有一个对象,其中包含序列化HTMLFormElement(2维)的预格式化属性名称:

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更新了示例。这似乎是相关的,并且也得到快递的body-parser支持。

2 个答案:

答案 0 :(得分:2)

您可以通过遍历给定对象来拆分路径并减少路径。如果不存在任何对象,请使用名称创建一个新属性,稍后分配该值并删除splitted属性。



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




答案 1 :(得分:1)

您可以像这样使用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)