Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript对象格式化程序以错误顺序返回数据的递归实现_Javascript - Fatal编程技术网

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 #":

我试图编写一个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)
}

通常情况下,对于顺序很重要的事情,您不应该依赖于
for…in
循环。根据MDN:

A
for…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对象本质上是一个树。为什么?

  • 它包含根节点(顶级对象本身)
  • 根节点有子节点(属于对象的各种键)
  • 每个孩子只有一个父母
  • 每个孩子都可以多生一个兄弟姐妹
  • 如果节点本身是一个对象(非数组),那么它可以有自己的子节点
您的任务是按特定顺序打印出树。按照从左到右读取对象的顺序,使用适当的缩进指定对象的嵌套

但是,如果您将JSON对象视为一棵树,这意味着您需要对该对象进行预序遍历。这是因为您希望在遍历节点的子节点之前对节点执行操作,在本例中,请打印它

基本算法是:

  • 访问节点并执行某些操作
  • 遍历子树中的每个子树并重复上述操作
因为它适用于您的问题:

  • 访问节点并打印密钥
  • 如果节点的值是一个对象,则迭代该对象中的每个键并重复上述操作
  • 如果节点的值不是对象,请打印该值
虽然递归不是实现这一点所必需的,但它有助于跟踪我们所处的级别,因为级别将意味着我们缩进的程度

这里只有一个潜在的解决方案,做一个预订单DFS

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

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);
}