节点 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
的自定义实现,它只是用空格分隔元素。
我正在使用 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
的自定义实现,它只是用空格分隔元素。