Beautifier без фактического разбора? - PullRequest
0 голосов
/ 13 сентября 2018

Я новичок в мире JavaScript, поэтому наберитесь терпения.

У меня есть необработанный ответ "JSON" с дубликатами ключей , и я хочу сделать его более читабельным. Проблема здесь во встроенном синтаксическом анализе: когда я пытаюсь пропустить его через JSON.stringify - он анализирует мой ввод для объекта JSON, и дублирующиеся ключи исчезают.

Как я могу подойти к этой проблеме по-другому и сохранить дубликаты?

1 Ответ

0 голосов
/ 13 сентября 2018

- супер упражнение для отработки регулярных выражений.

Давайте посмотрим на мой код шаг за шагом:

// Create inline json with nested object.
const originalJson = `{dfkoz:'efzf','dd':"ddd",'zfzfzf','foo': {bar:1}}`;

затем разделите его на массивы по ожидаемым строкам.

const lines = originalJson.replace(/[^,],+/g,"$&\n") \\ after each ',' let add '\n' after.
.replace(/{/g,"$&\n") // Add \n after any '{'
.replace(/}/g,"\n$&") // Add \n before any '}'
.split('\n'); // Split string to array with breakline separator

В этот момент у вас будет такой массив:

0: "{"
1: "dfkoz:'efzf',"
2: "'dd':"ddd","
3: "'zfzfzf',"
4: "'foo': {"
5: "bar:1"
6: "}"
7: "}"

тогда вы должны зациклить его и добавить логику табуляции и разбиения:

let formatedJson = '';
let nbrOfIndent = 0;
let previousNbrOfIndent = 0;
let isFindIndentMarker = false;
lines.forEach(line => {
  previousNbrOfIndent = nbrOfIndent;
  // if line is just { or finish by {, we have to increment number of \t for next loop iteration.
  if(line === '{' || line.substr(-1) === '{') {
    nbrOfIndent++;
    isFindIndentMarker = true;
  }
  // if current line is just } or finish by , we have to decrease number of \t for next tick.
  else if(line === '}' || line.substr(-1) !== ',') {
    nbrOfIndent--;
    isFindIndentMarker = true;
  }
  formatedJson += "\t".repeat((!isFindIndentMarker)?nbrOfIndent:previousNbrOfIndent) + line + "\n";
});

Онлайн-образец

...