функция prettify в JavaScript - PullRequest
       2

функция prettify в JavaScript

2 голосов
/ 05 марта 2019

Я пишу простую функцию PrettyPrint, которая только поверхностно пересекает строки и объекты.

Я думаю, что это довольно близко

это просто

  {
    "name": "Jon",
    "facts": {
      "car": "Ford",
      "address": {
        "city": "New York"
      },
      "watch": "Casio",
      "other": {}
    },

 }

the}и пробел после этого перед закрывающей скобкой, как мне исправить это, чтобы он выводил, как если бы JSON.Stringify был?

  {
    "name": "Jon",
    "facts": {
      "car": "Ford",
      "address": {
        "city": "New York"
      },
      "watch": "Casio",
      "other": {}
    }
 }

const exampleJson = {"name":"Jon","facts":{"car":"Ford","address":{"city":"New York"},"watch":"Casio","other": {}}};

const prettify = obj => {

  tabs = n => Array(n).fill(' ').join('');

  let traverse = (obj, tab = 1) => {
    let markup = '{\n';

    Object.entries(obj).forEach(kv => {
      const [key, val] = kv;
      if (typeof val === 'string') {
        const { length } = Object.keys(val);
        markup += `${tabs(tab)} "${key}": "${val}"`;
      } else if (typeof val === 'object') {
        const { length } = Object.keys(val);
        if (length > 0) {
          markup += `,\n${tabs(tab)} "${key}": ${traverse(val, tab+2)},\n`;
        } else {
          markup += `,\n${tabs(tab)} "${key}": {}`;
        }

      }
    })
    
    markup += `\n${tabs(tab - 1)}}`;
    return markup;
  }

  let results = traverse(obj);

  console.log(results);
}

prettify(exampleJson);

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Вы добавляете запятую в этом случае, но не в другом, в одном случае вы добавляете ее в другом, вы добавляете в другом, вы делаете оба. Это никогда не будет работать в общем случае.

Вместо этого вы должны использовать запятую и символ новой строки независимо от значения. Либо добавьте его ко всему, кроме первого

 Object.entries(obj).forEach(([key, value], i) => {
   if(i) markup += ",\n";
   markup += tabs(tab);
   markup += key + ": ";
   // serialize and add value
 });

Или добавить его ко всему, кроме последнего:

Object.entries(obj).forEach(([key, value], i, { length }) => {
   markup += tabs(tab);
   markup += key + ": ";
   // serialize and add value
   if(i !== length - 1) markup += ",\n";
});
1 голос
/ 05 марта 2019

Вы можете решить обе эти проблемы одновременно, replace, используя несколько символов:

const exampleJson = {"name":"Jon","facts":{"car":"Ford","address":{"city":"New York"},"watch":"Casio","other": {}}};

const prettify = obj => {

  tabs = n => Array(n).fill(' ').join('');

  let traverse = (obj, tab = 1) => {
    let markup = '{\n';

    Object.entries(obj).forEach(kv => {
      const [key, val] = kv;
      if (typeof val === 'string') {
        const { length } = Object.keys(val);
        markup += `${tabs(tab)} "${key}": "${val}"`;
      } else if (typeof val === 'object') {
        const { length } = Object.keys(val);
        if (length > 0) {
          markup += `,\n${tabs(tab)} "${key}": ${traverse(val, tab+2)},\n`;
        } else {
          markup += `,\n${tabs(tab)} "${key}": {}`;
        }

      }
    })
    
    markup += `\n${tabs(tab - 1)}}`;
    return markup;
  }

  let results = traverse(obj);

  console.log(results.replace("\,\n\n", "\n"));
}

prettify(exampleJson);
.as-console-wrapper { max-height: 100% !important; top: auto; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...