javascript 自定义`util.inspect()`的格式

zvms9eto  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(108)

我正在寻找一种干净地格式化util.inspect()输出的方法(可能不需要替换正则表达式)。
当前代码:

const obj = {
    x: {
        y: "",
    },
    foo: {
        bar: "abc",
        baz: true,
    },
    stuff: {
        a: "",
        b: "",
        c: "",
    },
};

console.log(
    util.inspect(obj)
);

结果:

{
  x: { y: '' },
  foo: { bar: 'abc', baz: true },
  stuff: { a: '', b: '', c: '' }
}

是否有一种干净的方法来保留(或至少部分地重新创建)原始格式?不幸的是,util.inspect()不提供选项,例如更改缩进,引号(单引号/双引号)或换行符 (它做,见编辑) 后的每个属性。
(我也是opened an issue,以防其他人也想要这个功能)
我不能使用JSON.stringify(),因为我也想保留JS属性,而且我也不希望属性被引用。将整个文件作为字符串读取并以某种方式提取所需的对象也不是一个好的解决方案。
有没有一个干净的解决方案?如果可能的话,nodejs内置实用程序,没有第三方代码格式化模块。
编辑:显然util.inspect()提供了compact选项,该选项在设置为false时解决了换行符问题。

wh6knrhe

wh6knrhe1#

我最终根本没有使用util.inspect(),因为它在一些深度嵌套的对象上会中断。这就是为什么我现在做了一个自定义函数,在Object上保留非JSON属性:

const stringifyObject = function(obj, indent = 0){
    const indentStr = " ".repeat(indent);
    const entries = Object.entries(obj).map(([key, value]) => {
        if (typeof value === "function")
            return `${indentStr}    ${key}: ${value.toString()},`;
        else if (typeof value === "object" && value !== null)
            return `${indentStr}    ${key}: ${stringifyObject(value, indent + 4)},`;
        return `${indentStr}    ${key}: ${JSON.stringify(value)},`;
    }).join("\n");
    return `{\n${entries}\n${indentStr}}`;
};

不好看,但很管用。

const stringifyObject = function(obj, indent = 0){
    const indentStr = " ".repeat(indent);
    const entries = Object.entries(obj).map(([key, value]) => {
        if (typeof value === "function")
            return `${indentStr}    ${key}: ${value.toString()},`;
        else if (typeof value === "object" && value !== null)
            return `${indentStr}    ${key}: ${stringifyObject(value, indent + 4)},`;
        return `${indentStr}    ${key}: ${JSON.stringify(value)},`;
    }).join("\n");
    return `{\n${entries}\n${indentStr}}`;
};

const obj = {
    foo: {
        bar: 1,
        baz: true,
    },
    stuff: {
        a: "foo",
        c: () => "abc",
        d: function(x){
            const a = 1 + x;
            return ++a;
        },
    },
};

console.log("const obj = " + stringifyObject(obj));

相关问题