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