console.table 无法递归展示嵌套对象,仅显示一层自有属性,适用扁平数据;处理深层嵌套需手动展平并加空值防护,或改用 JSON.stringify、自定义 formatter 或浏览器原生对象查看。
直接调用 console.table 处理含多层嵌套的对象(比如订单里带用户、地址、商品列表、每个商品又有规格和库存),控制台只会把嵌套字段渲染成 [object Object] 或 [object Array],点开才能看细节——这完全失去了“网格视图”的意义。
根本原因是 console.table 的设计初衷是展示「类表格结构」数据,它只检查数组元素或对象的自有属性(own properties),且默认不递归展开。它不解析 user.address.city 这样的路径,也不支持自定义列映射。
[{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}])data.items[0].specs['v1.2'])最可控的方式是自己构造一个扁平数组,把你想在表格中看到的嵌套路径提前取出来。比如从订单对象中提取 order.id、order.user.name、order.items.length、order.items[0].sku 等。
注意别硬写 order.items[0].sku —— 要加空值防护,否则遇到 items 为空时会报 Cannot read property 'sku' of undefined。
order?.items?.[0]?.sku || ''
order.items?.length ?? 0
map 中做复杂计算或副作用,保持纯函数性userName 而非 user.name
const flatOrders = orders.map(order => ({ id: order.id, userName: order?.user?.name || '-', city: order?.user?.address?.city || '-', itemCnt: order?.items?.length ?? 0, firstSku: order?.items?.[0]?.sku || '-'}));<br>console.table(flatOrders);
console.table 第二个参数可以传入字符串数组,指定只显示其中几列,避免无关字段挤占视图空间。这对字段多、嵌套后生成的扁平对象特别有用。
'userName.toUpperCase()')console.table(flatOrders, ['id', 'userName', 'itemCnt']);
当业务数据包含循环引用、函数、Symbol、日期对象、或需要按条件展开不同层级(比如只在 status === 'shipped' 时才展开物流信息),console.table 就彻底失效了。
这时候强行“适配”只会让代码越来越难维护。不如切换策略:
console.log(JSON.stringify(data, null, 2)) 快速查看结构(注意:会丢失函数、undefined、循环引用)console.log 输出真正难的从来不是怎么让 console.table 显示嵌套数据,而是判断哪些字段值得放进表格、哪些该交给交互式查看器处理。这个边界划得不清,后面加再多层封装也只是把坑藏得更深一点。