簡體   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