распечатать ЛЮБОЙ объект javascript

1

Я не начинающий программист, я знаю, как console.log(myObject). То, что я хочу, это иметь возможность печатать ЛЮБОЙ объект в строку с максимальной глубиной, и не иметь пустых свойств в нем. Есть много раз, когда мне нужно распечатать объект на консоли или в каком-либо журнале, и он печатает ВЕСЬ объект. Это может занять так много места, что мой терминал не может вместить весь объект. Причина, по которой я спрашиваю об этом, заключается в том, чтобы кто-то мог определить все крайние случаи, которые я, возможно, пропускаю, или места, где я обдумываю вещи.

Вот пример:

[
  {
    a: 'a',
    b: '',
    c: {
      d: 'd',
      e: {
        f: {
          g: 'g'
        }
      },
      h: [
        'i',
        'j',
        { k: 'k' }
      ],
      l: [],
    }
  }
]

printAny (myObject, 5) должен вывести:

[
  {
    a: 'a',
    c: {
      d: 'd',
      e: {
        f: '<objec>'
      },
      h: [
        'i',
        'j',
        '<object>'
      ],
    }
  }
]

Я сделал jsbin еще на нескольких примерах: https://jsbin.com/buzugipole/edit?js,console

Следует также обрабатывать циклы. Я не против использования библиотек npm, это то, что я использую сейчас, но это мешанина из 3 разных библиотек, которые все пытаются решить эту проблему.

  • 0
    Как насчет этого ? (Не голосуйте за дурака, так как не уверены, что это точно соответствует вашим требованиям.)
  • 0
    вы можете использовать утилиту в браузере? Изменить: util.inspect делает почти все, что мне нужно, но он не работает в браузере
Показать ещё 3 комментария
Теги:
console

1 ответ

1

Вы можете клонировать объект, рекурсивно перебирая его ключи и значения, передавая число nestingToGo которое определяет, насколько больше разрешено вложение до того, как <object> будет напечатан вместо фактического объекта:

const obj = [
  {
    a: 'a',
    b: '',
    c: {
      d: 'd',
      e: {
        f: {
          g: 'g'
        }
      },
      h: [
        'i',
        'j',
        { k: 'k' }
      ],
      l: [],
    }
  }
];

function replaceNested(obj, nestingToGo) {
  const initial = Array.isArray(obj) ? [] : {};
  return Object.entries(obj).reduce(( a, [key, val]) => {
    if (typeof val === 'object') {
      a[key] = nestingToGo === 0
      ? '<object>'
      : replaceNested(val, nestingToGo - 1)
    } else {
      a[key] = val;
    }
    return a;
  }, initial);
}

function printAny(obj, maxNesting) {
  const slimmerObj = replaceNested(obj, maxNesting);
  console.log(JSON.stringify(slimmerObj, null, 2));
}
printAny(obj, 3);

Другой вариант - использовать регулярное выражение для замены всех строк, начинающихся с достаточного количества пробелов:

const obj = [
  {
    a: 'a',
    b: '',
    c: {
      d: 'd',
      e: {
        f: {
          g: 'g'
        }
      },
      h: [
        'i',
        'j',
        { k: 'k' }
      ],
      l: [],
    }
  }
];

function printAny(obj, maxNesting) {
  const stringified = JSON.stringify(obj, null, 2);
  const maxSpaces = maxNesting * 2;
  const pattern = new RegExp(
    String.raw'[{\[]\n {${maxSpaces + 2}}\S[\s\S]+?^ {${maxSpaces}}\S',
    'gm'
  );
  const slimStringified = stringified.replace(pattern, '<object>');
  console.log(slimStringified);
}
printAny(obj, 4);

Ошибки не могут быть хорошо сериализованы, но если вам нужно, вы можете Error.prototype собственный метод toJSON:

const obj = [
  {
    err: new Error('foo'),
    a: 'a',
    b: '',
    c: {
      d: 'd',
      e: {
        f: {
          g: 'g'
        }
      },
      h: [
        'i',
        'j',
        { k: 'k' }
      ],
      l: [],
    }
  }
];

Error.prototype.toJSON = function() {
  return '<Error> ' + this.message;
};
function printAny(obj, maxNesting) {
  const stringified = JSON.stringify(obj, null, 2);
  const maxSpaces = maxNesting * 2;
  const pattern = new RegExp(
    String.raw'[{\[]\n {${maxSpaces + 2}}\S[\s\S]+?^ {${maxSpaces}}\S',
    'gm'
  );
  const slimStringified = stringified.replace(pattern, '<object>');
  console.log(slimStringified);
}
printAny(obj, 4);
  • 0
    это действительно хорошее решение. только несколько вещей, которые нужно добавить, и это также удалит пустые места, как это останавливает циклический объект? Редактировать: не важно.
  • 0
    После того, как пройдет достаточное количество итераций, так что maxNesting будет равен нулю, даже если существуют более глубокие циклические ссылки, они будут игнорироваться, поскольку они превышают предел вложенности. Но я бы предпочел подход с регулярными выражениями.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню