gpt4 book ai didi

javascript - 以错误顺序返回数据的javascript对象格式化程序的递归实现

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

我正在尝试编写 JSON/javascript 对象格式化程序的实现,但出于某种原因,我的函数以错误的顺序返回对象组件。例如,以下对象:

{"Crows":{"players":{"Ben":{"jersey #":"1B"},"Ty":{"jersey #":"2B"}}},"Pigeons":{"players":{"Bill":{"jersey #":"1B"},"Tim":{"jersey #":"2B"}}},"Seagulls":{"players":{"Bob":{"jersey #":"1B"},"Tom":{"jersey #":"2B"}}}, "bob": [1, 2, 3]}

在函数中用作参数时应返回:

{
"Crows": {
"players": {
"Ben": {
"jersey #": "1B"
},
"Ty": {
"jersey #": "2B"
}
}
},
"Pigeons": {
"players": {
"Bill": {
"jersey #": "1B"
},
"Tim": {
"jersey #": "2B"
}
}
},
"Seagulls": {
"players": {
"Bob": {
"jersey #": "1B"
},
"Tom": {
"jersey #": "2B"
}
}
}
}

相反,它会返回如下内容:

'
'jersey #:1B',

'
'jersey #:2B',

'
Ben: {
undefined},
'
Ty: {
undefined},

'
players: {
undefined},

'
'jersey #:1B',

'
'jersey #:2B',

'
Bill: {
undefined},
'
Tim: {
undefined},

'
players: {
undefined},

'
'jersey #:1B',

'
'jersey #:2B',

'
Bob: {
undefined},
'
Tom: {
undefined},

'
players: {
undefined},

'
Crows: {
undefined},
'
Pigeons: {
undefined},
'
Seagulls: {
undefined},

我构建导致这种奇怪格式的逻辑的方式有什么不正确的地方?

function prettyPrint(data){
var result = "";
const indent = " ";
for (var key in data) {
// console.log("key is: " + key)
var value = data[key]
// console.log("value is:" + value)

if (typeof value == 'string'){
var line = "\n" + "'" + key + ":" + value + "'";
// console.log("line we just generated when value is a string:" + line)
result += "'" + line + ",\n";
}
else if (typeof value == 'object'){
// console.log("the value is an object")
if (value instanceof Array){
// console.log("value is an array")
var line = "\n" + "'" + key + "'" + ": " + "[ " + value + " ]";
// console.log("line we just generated when value is an array object:" + line)
result += "'" + line + ",\n";
}

else{
// console.log("the value is an object of type dict")
var line = "\n" + key + ": " + "{\n" + indent + prettyPrint(value) + "}";
// console.log("line we just generated when value is a dict object:" + line)
result += "'" + line + ",\n";
}
}

}
console.log(result)
}

最佳答案

在我们进入实际解决方案之前,让我们退后一步,了解我们正在处理的数据类型以及我们正在尝试做什么。其中一些可能是显而易见的,但也许其他读者可以从中受益:

JSON 对象本质上是一棵。为什么?

  • 它包含一个根节点(顶级对象本身)
  • 根节点有 child (属于对象的各种键)
  • 每个 child 都有一个 parent 。
  • 每个 child 都可以再有一个 sibling 。
  • 如果节点本身是一个对象(非数组),它可以有自己的子节点。

您的任务是以特定顺序打印出树。按照您从左到右阅读对象的顺序,使用适当的缩进来指定对象的嵌套。

但是,如果您将 JSON 对象视为一棵树,这意味着您需要对该对象进行预序遍历。这是因为您想对节点做一些事情,遍历节点的子节点之前,在这种情况下,打印它。

基本算法是:

  • 访问一个节点并做一些事情
  • 遍历子树中的每一个 child ,重复上面的操作。

因为它适用于您的问题:

  • 访问节点并打印 key
  • 如果节点的值是一个对象,则遍历该对象中的每个键并重复上面的操作。
  • 如果节点的值不是对象,则打印该值。

虽然递归不是实现这一点所必需的,但它有助于跟踪我们所处的级别,因为级别意味着我们缩进了多远。

这只是一种可能的解决方案,即进行预购 DFS。

请记住,我只是做 console.log 输出只是为了强调构成一行所需的不同变量。我也没有注意尾随逗号、数组的格式等。但这应该给你一个基本结构。

var json = {"Crows":{"players":{"Ben":{"jersey #":"1B"},"Ty":{"jersey #":"2B"}}},"Pigeons":{"players":{"Bill":{"jersey #":"1B"},"Tim":{"jersey #":"2B"}}},"Seagulls":{"players":{"Bob":{"jersey #":"1B"},"Tom":{"jersey #":"2B"}}}, "bob": [1, 2, 3]}

function prettyPrint(key, val, level) {
// Get indentation amount
let indent = "";
for (let x = 0; x < level; x++) {
indent += " ";
}

// Will we need to print the key?
let keyLabel = key ? key + ':' : '';

// If the value is an object, traverse children pre-order
if (typeof val === 'object' && !Array.isArray(val)) {
console.log(indent, keyLabel, '{');
Object.keys(val).forEach((k) => {
prettyPrint(k, val[k], level+1)
});
console.log(indent, '}', ',');
} else {
// Otherwise just print the value
console.log(indent, keyLabel, val, ',');
}
}


prettyPrint(null, json, 0)

关于javascript - 以错误顺序返回数据的javascript对象格式化程序的递归实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55737701/

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