@iharaleynikov

Как правильно вывести древовидный объект в виде строки?

У меня есть функция, которая выводит плоский объект в виде строки в консоль:

const object = {
  data: 11444,
  package: 'dddEE5',
};

const objToString = (obj) => {
  const result = [];

  result.push('{');

  for (const key in obj) {
    if (typeof obj[key] === 'object') {
      result.push(objToString(obj[key]));
    }
    result.push(`  ${key}: ${obj[key]}`);
  }

  result.push('}');

  return result;
};

objToString(object).map(key => console.log(key));

// {
//   data: 11444
//   cd: dddEE5
// }

Как правильно применить рекурсию в этой функции, чтобы она смогла выводить древовидный объект?
Например если будет такой объект:

const object = {
  data: 11444,
  cd: {
    package: 'dddEE5',
  },
};

objToString(object).map(key => console.log(key));

// {
//   data: 11444
//   cd: {
//     package: 'dddEE5'
//   }
// }
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
function objToString(val, tabSize = 2, depth = 0, noIndent = false) {
  const indent = ' '.repeat(tabSize * depth);

  return (noIndent ? '' : indent) + (
    val instanceof Array
      ? `[\n${val.map(n => objToString(n, tabSize, depth + 1)).join(',\n')}\n${indent}]`
      : val instanceof Object
        ? `{\n${Object
            .entries(val)
            .map(n => n.map((m, i) => objToString(m, tabSize, depth + 1, i)).join(': '))
            .join(',\n')}\n${indent}}`
        : typeof val === 'string'
          ? `"${val}"`
          : val
  );
}


console.log(objToString({
  numbers: [ 69, 187, 666 ],
  strings: [ 'hello, world!!', 'fuck the world', 'fuck everything' ],
  falsy_values: [ 0, '', NaN, false, null, undefined ],
  object: { xxx: true, yyy: Infinity, zzz: { '!&$': [ [ [ -1 ] ] ] } }
}));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы