Есть ли способ преобразовать объектный ключ, содержащий массив, в объект? - PullRequest
0 голосов
/ 18 июня 2020

Вот мой текущий объект:

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

Я бы хотел, чтобы он выглядел так:

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

Как лучше всего это сделать?

Ответы [ 2 ]

1 голос
/ 18 июня 2020

В общем, ответ на плохо отформатированные данные - исправить средство форматирования, а не реализовать синтаксический анализатор. Однако я работал с системами, которые кодируют такие данные, поэтому вот парсер.

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;
}
1 голос
/ 18 июня 2020

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...