JavaScript算法题:尝试实现一个JSON解析函数以更漂亮的格式输出字符串

时间:2021-01-04 04:57:54

标签: javascript json

我很清楚 JSON.parseJSON.stringify 以及 prettier npm 包的存在。但出于某种原因,我仍然必须手工完成。把它想象成一个编码面试问题,请不要仅仅因为我可以使用 JSON.parseJSON.stringify 而关闭这个问题,因为我说过有这个限制。这个问题不是这个pretty-print JSON using JavaScript

的重复

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

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

即输出 string 应该是

   [
        "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
}

但是输出格式与在

中略有不同
[ 
    "foo", 
     { 
        bar:[ // ?
            "baz", 
            null, 
            1.0, 
            2 
        ] 
    } 
] 

我该如何解决这个格式问题?还有没有更优雅的方法或替代方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

这个呢,因为你还需要在冒号后面加一个回车:

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);
相关问题