【发布时间】:2021-04-09 22:11:00
【问题描述】:
我很清楚 npm 包中存在 JSON.parse 和 JSON.stringify 和 prettier。但由于某种原因,我仍然必须手动执行此操作。把它想象成一个编码面试问题,请不要仅仅因为我可以使用JSON.parse 和JSON.stringify 而关闭这个问题,正如我所说的那样有这个限制。
这是一个字符串"['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
]
}
]
如何解决此格式问题?还有没有更优雅的方式或替代方式来实现这一点?
【问题讨论】:
-
你打算自己推出这个功能吗?有些包(例如,
prettier)已经很好地做到了这一点 -
Joji,我在 luawtf 的答案中添加了一个部分,向您展示如何自己完成此操作。
-
@Thankyou 感谢您更新答案!新年快乐。你能在这里解释一下
t?.constructor吗? -
t.constructor允许我们检查任何t的类型。然而,因为我们希望允许t成为null或undefined,所以我们使用空值合并?.来防止对空值进行属性查找。您可以在我的一些other answers 中看到这种技术。 -
@谢谢你的更新!但是,当输入为字符串时,它似乎不起作用。例如如果输入是
"['foo', {bar:['baz',null,1.1,2]}]",则输出将是一个未格式化的字符串。
标签: javascript json