gpt4 book ai didi

javascript - JavaScript 中的 JSON pretty-print

转载 作者:行者123 更新时间:2023-11-28 10:55:33 27 4
gpt4 key购买 nike

尝试让我的缩进在 beautifulprint JS 函数上正常工作..只需要一个简单的 JSON stringify 即可漂亮地打印。

我处于一个锁定的旧 JS 服务器环境中。没有 JSON 对象。我无法使用 JSON.stringify 或 JSON polyfill,所以我必须编写自己的函数..

function prettyprint(obj, ind){
ind = ind || 0;
var indent = spaces(ind), str = '';

if((typeof obj).match(/string|number/) || obj == null){
return indent + obj;

} else if(obj.push){

for(var i=0;i<obj.length;i++){
str = str + prettyprint(obj[i], ind+2 || 2);
}
return indent + '[' + str + ']\n';

} else {

str = indent + ' {';
for(var i in obj){
str = str + '\n' + indent+' '+ i + ': ' + prettyprint(obj[i], ind+2);
}
return str +'\n';

}

return str;


function spaces(n){
return Array(n).join(' ');
}
}

这就是我正在尝试的等等.. beautifulprint({'a':'b','b':{'c':'d'}})

最佳答案

我认为解决这个问题会很有趣;我尝试修改您的代码作为起点,但很快发现在正确的位置管理逗号和回车变得非常复杂。

因此,我将其转换为运行传递给它的对象的代码,并在格式化输出字符串时发出 token 。我已粘贴下面的代码。

prettyPrint.js:

prettyPrint = function (data) {
return new prettyPrint.processor(data).output;
}

prettyPrint.indentString = ' ';

prettyPrint.processor = function (data) {
var indent = 0,
output = '',
tokens = {
value: 1,
openArray: 2,
arrayValueSeparator: 3,
closeArray: 4,
openObject: 5,
objectValueName: 6,
objectValueSeparator: 7,
closeObject: 8
};

function isArray(unknown) {
return Object.prototype.toString.call(unknown) === '[object Array]';
}

function isObject(unknown) {
return Object.prototype.toString.call(unknown) === '[object Object]';
}

function space() {
var count = indent;
var result = '';
while (count--) result += prettyPrint.indentString;
return result;
}

function emit(tokenType, value) {
switch (tokenType) {
case tokens.value:
output += value;
break;

case tokens.openArray:
output += '[';
break;

case tokens.arrayValueSeparator:
output += ', ';
break;

case tokens.closeArray:
output += ']';
break;

case tokens.openObject:
output += '{';
indent += 1;
break;

case tokens.objectValueName:
output += '\n' + space() + (/^[a-z][a-z0-9_]*$/i.test(value) ? value : "'" + value + "'") + ': ';
break;

case tokens.objectValueSeparator:
output += ',';
break;

case tokens.closeObject:
indent -= 1;
output += '\n' + space() + '}';
break;
}
}

function process(data) {
var p, first;

if (data === undefined) {
return;
}

// Don't surround null with quotes.
if (data === null) {
emit(prettyPrint.tokens.value, 'null');
}

else if (isArray(data)) {
emit(tokens.openArray);
first = true;
for (p in data) {
if (!first) {
emit(tokens.arrayValueSeparator);
}
process(data[p]);
first = false;
}
emit(tokens.closeArray);
}

else if (isObject(data)) {
emit(tokens.openObject);
first = true;
for (p in data) {
if (data.hasOwnProperty(p) && data[p] !== undefined) {
if (!first) {
emit(tokens.objectValueSeparator);
}
emit(tokens.objectValueName, p);
process(data[p]);
first = false;
}
}

emit(tokens.closeObject);
}

else if (data instanceof Date) {
emit(tokens.value, "'" + data.toISOString() + "'");
}

else if (typeof data === 'number') {
emit(tokens.value, isNaN(data) ? 'null' : data.toString());
}

else {
emit(tokens.value, "'" + data.toString() + "'");
}
}

// Start processing the data.
process(data);

// Export the data.
this.output = output;
}

prettyPrint.html:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>Pretty Print Testing</title>
<script type="text/javascript" src="prettyPrint.js"></script>
</head>
<body>

<pre id="pretty1"></pre>

<pre id="pretty2"></pre>

<script type="text/javascript">
document.getElementById('pretty1').innerHTML = prettyPrint({ 'a': 'b', 'b': { 'c': 'd' } });

document.getElementById('pretty2').innerHTML = prettyPrint([1, 2, "three", { 'complex-name': [1] }, { simpleName: { subArray: [1, 2, 3], subString: "Hello" } }]);
</script>

</body>
</html>

输出:

{
a: 'b',
b: {
c: 'd'
}
}

[1, 2, 'three', {
'complex-name': [1]
}, {
simpleName: {
subArray: [1, 2, 3],
subString: 'Hello'
}
}]

希望这对您有用。

关于javascript - JavaScript 中的 JSON pretty-print ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24311409/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com