打印任何javascript对象

时间:2019-01-08 22:26:57

标签: javascript json console

我不是菜鸟程序员,我知道如何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 :(得分: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);