我有这样一个对象:

const myObject = {
   "a":"a",
   "b":{
      "c":"c",
      "d":{
         "e":"e",
         "f":{
            "g":"g",
            "h":{
               "i":"i"
            }
         }
      }
   }
};

但是当我尝试使用console.log(myObject)显示它时,我收到这样的输出:

{ a: 'a', b: { c: 'c', d: { e: 'e', f: [Object] } } }

我怎样才能得到完整的对象,包括属性f的内容?


当前回答

您可以简单地向对象添加一个inspect()方法,该方法将覆盖console.log消息中的对象表示

eg:

var myObject = {
   "a":"a",
   "b":{
      "c":"c",
      "d":{
         "e":"e",
         "f":{
            "g":"g",
            "h":{
               "i":"i"
            }
         }
      }
   }
};
myObject.inspect = function(){ return JSON.stringify( this, null, ' ' ); }

然后,您的对象将在console.log和node shell中按要求表示


更新:

对象。Inspect已弃用(https://github.com/nodejs/node/issues/15549)。使用myObject [util.inspect。自定义):

const util = require('util')

var myObject = {
  /* nested properties not shown */
}

myObject[util.inspect.custom] = function(){ return JSON.stringify( this, null, 4 ); }


console.log(util.inspect(myObject))

其他回答

JSON.stringify()

let myVar = {a: {b: {c: 1}}};
console.log(JSON.stringify( myVar, null, 4 ))

非常适合深入检查数据对象。这种方法适用于嵌套数组和带有数组的嵌套对象。

简单的选择:

console.log ' % ', myObject);

试试这个:

console.dir(myObject,{depth:null})

您可以简单地向对象添加一个inspect()方法,该方法将覆盖console.log消息中的对象表示

eg:

var myObject = {
   "a":"a",
   "b":{
      "c":"c",
      "d":{
         "e":"e",
         "f":{
            "g":"g",
            "h":{
               "i":"i"
            }
         }
      }
   }
};
myObject.inspect = function(){ return JSON.stringify( this, null, ' ' ); }

然后,您的对象将在console.log和node shell中按要求表示


更新:

对象。Inspect已弃用(https://github.com/nodejs/node/issues/15549)。使用myObject [util.inspect。自定义):

const util = require('util')

var myObject = {
  /* nested properties not shown */
}

myObject[util.inspect.custom] = function(){ return JSON.stringify( this, null, 4 ); }


console.log(util.inspect(myObject))

从Node.js v0.10.33(稳定)/ v0.11.14(不稳定)到(至少)v7.7.4(该答案最新更新的当前版本)的许多有用答案的编译。向罗里·奥凯恩的帮助致敬。

博士tl;

要获得问题中示例所需的输出,请使用console.dir():

console.dir(myObject, { depth: null }); // `depth: null` ensures unlimited recursion

为什么不使用util.inspect()?因为它已经是诊断输出的核心:console.log()和console.dir()以及Node.js REPL隐式使用util.inspect()。通常不需要require('util')并直接调用util.inspect()。

下面的细节。


Console.log()(及其别名console.info()): 如果第一个参数不是格式字符串:util.inspect()会自动应用到每个参数: O = {1: 1, 2: 'deux', foo: function(){}};console.log (o,[1、2、3 ]) // -> '{ 一:1、二:“两个”,foo:[功能]}[1,2,3]” 注意,在这种情况下,你不能通过util.inspect()传递选项,这意味着两个值得注意的限制: 输出的结构深度限制为2级(默认值)。 因为你不能用console.log()改变这一点,你必须使用console.dir(): console。dir(myObject, {depth: null}打印无限深度;见下文。 你不能打开语法着色。 如果第一个参数是一个格式字符串(见下文):使用util.format()打印基于格式字符串的其余参数(见下文);例如: O = {1: 1, 2: 'deux', foo: function(){}};console.log (o为JSON: % j, o ) // -> ' o为JSON:{“一”:1、“两个”:两个“}” 注意: 没有占位符来表示util.inspect()样式的对象。 使用%j生成的JSON不是漂亮打印的。 console.dir (): 只接受1个参数来inspect,并且总是应用util.inspect()——本质上,默认情况下,util.inspect()的包装器没有选项;例如: O = {1: 1, 2: 'deux', foo: function(){}};console.dir (o);//实际上与console.log(o)在这种情况下相同。 Node.js v0.11.14+:可选的第二个参数指定了util.inspect()的选项-参见下面;例如: 控制台。Dir ({1: 1, 2: 'deux'}, {colors: true});// Node 0.11+:打印带有语法着色的对象表示。

REPL:使用带有语法着色的util.inspect()隐式打印任何表达式的返回值; 例如,只需输入变量名并按Enter键,就会打印出其值的检查版本;例如: o = {one: 1, two: 'deux', foo: function(){}} // REPL用语法着色回显对象定义。

inspect()自动漂亮地打印对象和数组表示,但只在需要时产生多行输出。

漂亮打印行为可以由可选options参数中的compact属性控制;False无条件地使用多行输出,而true完全禁用漂亮打印;它也可以被设置为一个数字(默认值是3)来控制有条件的多行行为——参见文档。 默认情况下,输出大约60个字符谢谢,Shrey ,不管输出是发送到文件还是终端。在实践中,由于换行只发生在属性边界处,因此您通常会得到较短的行,但它们也可以更长(例如,具有较长的属性值)。 在v6.3.0+中,您可以使用breakLength选项来覆盖60个字符的限制;如果你将它设置为Infinity,所有内容都将输出到一行中。

如果你想对漂亮打印有更多的控制,可以考虑使用带有第三个参数的JSON.stringify(),但请注意以下内容:

对于具有循环引用的对象失败,例如全局上下文中的module。 方法(函数)将被设计不包括在内。 不能选择显示隐藏的(不可枚举的)属性。 示例调用: JSON。Stringify({一:1,二:'deux',三:true},未定义,2);//创建一个漂亮打印的多行JSON表示,缩进2个空格


inspect()选项对象(第二个参数):

可以传递一个可选的options对象来改变格式化字符串的某些方面;支持的一些属性是:

查看最新的Node.js文档了解当前完整的列表。

showHidden 如果为真,则对象的不可枚举属性[当你在obj或object .keys(obj)中使用键时指定不显示的属性]也将显示。默认为false。 深度 告诉检查在格式化对象时要递归多少次。这对于检查大型复杂对象非常有用。默认值为2。为了使它无限递归,传递null。 颜色 如果为真,则输出将使用ANSI颜色代码进行样式化。默认为false。颜色可定制[…-见链接]。 customInspect 如果为false,则不会调用在被检查对象上定义的自定义inspect()函数。默认为true。


Util.format()格式字符串占位符(第一个参数)

一些受支持的占位符是:

查看最新的Node.js文档了解当前完整的列表。

%s -字符串。 %d -数字(整数和浮点数)。 %j - JSON。 %% -单个百分号(' % ')。这并不消耗一个论点。