распечатать ЛЮБОЙ объект javascript - PullRequest
0 голосов
/ 09 января 2019

Я не начинающий программист, я знаю, как 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 разных библиотек, которые пытаются решить эту проблему.

1 Ответ

0 голосов
/ 09 января 2019

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