节点 util.inspect 意外破坏简单数组

node util.inspect breaking simple array unexpectedly

我正在使用 util.inspect 格式化一个被操纵的对象,然后再将其写回文件。最近我向这个对象引入了简单的数字数组,并且它们以一种意想不到的方式被格式化。这是我想要的输出(部分示例):

  app_preferred_items: [ 0, 6, 13, 16, 19, 23, 26 ],
  main_set: [
    {
      name: 'item1',
      show: true,
      description: 'Item One',
      id: 12,
      version: 1
    },
   {
      name: 'item2',
      show: true,
      description: 'Item Two',
      id: 13,
      version: 1
    }
  ]

但这是我得到的:

  app_preferred_items: [
     0,  6, 13, 16,
    19, 23, 26
  ],
  main_set: [
    {
      name: 'item1',
      show: true,
      description: 'Item One',
      id: 12,
      version: 1
    },
   {
      name: 'item2',
      show: true,
      description: 'Item Two',
      id: 13,
      version: 1
    }
  ]

我尝试了 here 中的各种选项,但都无济于事。我要么得到整个文件的一行(使用紧凑选项),这使得可读性变得困难,要么我不想要这种简单的数字数组中断模式。有没有办法让简单的数字数组保持在一行?

由于数组分组的绑定在 node.js 中进行了硬编码,因此没有干净的方法来更改此行为。然而,如果你想让简单的数字数组保持在一行上,这个函数应该可以工作:

const util = require('util');

const inspect = (obj, options) => {
  const clone = structuredClone(obj);
  const stack = [clone];
  while (stack.length) {
    const curr = stack.pop();

    if (typeof curr !== 'object') continue;

    if (Array.isArray(curr)) {
      // patch arrays that are all numbers
      if (curr.filter((v) => typeof v !== 'number').length == 0) {
        const repr = `[ ${curr.join(', ')} ]`;
        const patch = { [util.inspect.custom]: () => repr };
        curr.__proto__ = patch;
      }
    }

    for (const child of Object.values(curr)) stack.push(child);
  }
  return util.inspect(clone, options ?? {});
};

本质上,这会复制您的对象并为数字数组提供 util.inspect 的自定义实现,它只是用空格分隔元素。