有没有一种方法可以将包含数组的对象键转换为对象?

时间:2020-06-17 22:14:18

标签: javascript angularjs

这是我当前的对象:

{"or_11[and_3][gt@last_closed_sr]":"2019-06-18"}

我希望它看起来像:

{
  "or_11": {
    "and_3": {
      "gt@last_closed_sr": "2019-06-18",
    }
  }
}

做到这一点的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

let str = '"or_11[and_3][gt@last_closed_sr]":"2019-06-18"';

let first = str.replace(/"/g, '').match(/\w+/)[0];

let pattern = /\[(.+?)\]/g;
let matches = [];
let match;
while(match = pattern.exec(str)) {
  matches.push(match[1])
}

let val = str.replace(/"/g, '').split(':')[1];

let obj = {
  [first]: {
    [matches[0]]: {
      [matches[1]]: val
    }
  }
}

console.log(obj)

答案 1 :(得分:1)

通常,对格式不正确的数据的答案是修复格式化程序,而不是实现解析器。但是,我已经使用了对像这样的数据进行编码的系统,所以这里有一个解析器。

function parseSquareSeparatedData(data) {
  const result = {};

  Object.keys(data).forEach((key) => {
    const keyParts = key.replace(/]/g, "").split("[");
    const last = keyParts.pop();
    let resultPointer = result;
    keyParts.forEach((keyPart) => {
      if (!(keyPart in resultPointer)) {
        resultPointer[keyPart] = {};
      }
      resultPointer = resultPointer[keyPart];
    })
    resultPointer[last] = input[key];
  })

  return result;
}