繁体   English   中英

JavaScript 算法问题:尝试实现一个 JSON 解析 function 到 Z78E6221F6393D14CED666 格式的字符串

[英]JavaScript algorithm question: trying to implement a JSON parsing function to output a string in a prettier format

我很清楚JSON.parseJSON.stringify的存在和prettier的 npm ZEFE6B0D8E603E678C 但由于某种原因,我仍然必须手动执行此操作。 将其视为编码面试问题,请不要仅仅因为我可以使用JSON.parseJSON.stringify就关闭这个问题,正如我所说的那样有这个约束。 这个问题不是使用 JavaScript 的漂亮打印 JSON的重复

这是一个字符串"['foo', {bar:['baz',null,1.0,2]}]"

我想实现一个 function 来返回一个字符串,该字符串表示 json object 具有适当的缩进。

即 output字符串应该是

   [
        "foo", 
        {
            "bar":
            [
                "baz", 
                null, 
                1.0, 
                2
            ]
        }
    ]

这是我的尝试

function printJSON(str) {
    let spaces = [];
    let output = '';

    str.split('').forEach(char => {
        switch(char) {
            case '{':
            case '[':
                spaces.push('    ');
                output += char + '\n' + spaces.join('');
                break;
            case '}':
            case ']':
                spaces.pop();
                output += '\n' + spaces.join('') + char;
                break;
            case ',':
                output += char + '\n' + spaces.join('');
                break;
            default:
                output += char;
                break;
        }
    });

    console.log(output);
    return output
}

然而,output 格式略有偏离,如

[ 
    "foo", 
     { 
        bar:[ // 🚨
            "baz", 
            null, 
            1.0, 
            2 
        ] 
    } 
] 

如何解决此格式问题? 还有更优雅的方式或替代方式来实现这一目标吗?

怎么样,因为您还需要在冒号后添加回车:

function printJSON(str) {
    let spaces = [];
    let output = '';

    str.split('').forEach(char => {
        switch (char) {
            case '{':
            case '[':
                spaces.push('    ');
                output += char + '\n' + spaces.join('');
                break;
            case ':':
                output += char + '\n' + spaces.join('');
                break;
            case '}':
            case ']':
                spaces.pop();
                output += '\n' + spaces.join('') + char;
                break;
            case ',':
                output += char + '\n' + spaces.join('');
                break;
            default:
                output += char;
                break;
        }
    });

    console.log(output);
    return output
}

let string = "['foo', {bar:['baz',null,1.0,2]}]";
printJSON(string);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM