javascript对象格式化程序以错误顺序返回数据的递归实现
我试图编写一个JSON/javascript对象格式化程序的实现,但由于某些原因,我的函数返回的对象组件顺序错误。例如,以下对象:javascript对象格式化程序以错误顺序返回数据的递归实现,javascript,Javascript,我试图编写一个JSON/javascript对象格式化程序的实现,但由于某些原因,我的函数返回的对象组件顺序错误。例如,以下对象: {"Crows":{"players":{"Ben":{"jersey #":"1B"},"Ty":{"jersey #":"2B"}}},"Pigeons":{"players":{"Bill":{"jersey #":"1B"},"Tim":{"jersey #":"2B"}}},"Seagulls":{"players":{"Bob":{"jersey #":
{"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)
}
通常情况下,对于顺序很重要的事情,您不应该依赖于
for…in
循环。根据MDN:
Afor…in
循环以任意顺序迭代对象的属性(请参阅delete操作符以了解为什么不能依赖于迭代的表面顺序,至少在跨浏览器设置中是如此)
重点矿山
当需要保留元素顺序时,使用Object.keys()
或Object.values()
和for…of
或for
循环:
var obj = {
one: 1,
two: 2,
three: 3
};
var keys = Object.keys(obj);
for (let key, i = 0; i < keys.length; i++) {
key = keys[i];
console.log(obj[keys]);
}
还可以使用Object.values()
,它将列出值而不是键:
var values = Object.values(obj);
for (let value, i = 0; i < values.length; i++) {
console.log(value);
}
for (let value of values) {
console.log(value);
}
var-values=Object.values(obj);
for(let值,i=0;i
希望这有帮助 在进入实际解决方案之前,让我们回顾一下,了解我们正在处理的数据类型以及我们正在尝试做的事情。其中一些可能是显而易见的,但也许其他读者可以从中受益: JSON对象本质上是一个树。为什么?
- 它包含根节点(顶级对象本身)
- 根节点有子节点(属于对象的各种键)
- 每个孩子只有一个父母李>
- 每个孩子都可以多生一个兄弟姐妹李>
- 如果节点本身是一个对象(非数组),那么它可以有自己的子节点
- 访问节点并执行某些操作
- 遍历子树中的每个子树并重复上述操作
- 访问节点并打印密钥
- 如果节点的值是一个对象,则迭代该对象中的每个键并重复上述操作
- 如果节点的值不是对象,请打印该值
var json={“乌鸦”:{“玩家”:{“本”:{“泽西岛”:“1B”},Ty”:{“泽西岛”:“2B”},“鸽子”:{“玩家”:{“比尔”:{“泽西岛”:“1B”},“蒂姆”:{“泽西岛”:“2B”},“海鸥”:{“玩家”{“鲍勃”:“泽西岛”:“1B”},“汤姆”{“泽西岛”:“3,鲍勃”}
功能预打印(键、值、级别){
//获取缩进量
让缩进=”;
for(设x=0;x{
预打印(k,val[k],级别+1)
});
log(缩进,'}',',');
}否则{
//否则只需打印值
日志(缩进,键标签,val,,);
}
}
(数据,零,3)代码>>@返回者<代码>>返回者<代码>返回者<代码>{代码>{代码>{“乌鸦:{”玩家:{“球员:{”球员:{“球员:{”们:{“球员:{”本“球员:{”本“球员:{”本:{“本次,JS0,JS0,JS0,0,0 0 0 0 0 0 0,0 0 0 0 0,0 0 0,0 0,0 0 0,0 0 0 0 0 0 0,0 0 0 0 0 0 0 0 0,0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))))))))))<#“:“2B”}}},“鲍勃”:[1,2,3]}“
-查看所需的output@Ele我试图手动编写JSON格式化程序,而不是使用stringify之类的东西。这是为了练习:)@capncrunch应该如何打印bob数组值。您需要在末尾返回结果。您能解释一下为什么中的对于…不太可靠吗?
var values = Object.values(obj);
for (let value, i = 0; i < values.length; i++) {
console.log(value);
}
for (let value of values) {
console.log(value);
}