简体   繁体   English

JS对象:迭代到第n级

[英]JS object: Iteration till nth level

I have the following sample object: 我有以下示例对象:

{
   "sampleA":{
      "sampleB1":{
         "sampleC1":{
            "sample1":"sample",
            "sample2":"sample",
            "sample3":"sample",
            "sample4":"sample",
            "sample5":"sample"
         },
         "sampleB2":{
            "sample1":"sample",
            "sample2":"sample sample",
            "sample3":"sample",
            "sample4":"sample sample",
            "sample5":"sample sample",
            "sample6":"sample"
         },
         "sampleB3":{
            "sample1":"sample",
            "sample2":"sample sample",
            "sample3":"sample sample",
            "sample4":"sample sample",
            "sample5":{
               "sample6":"sample",
               "sample7":"sample sample",
               "sample8":"sample sample",
               "sample9":"sample sample",
               "sample10":"sample",
               "sample11":"sample"
            },
            "sample100":"sample"
         }
      }
   }
}

It's a JS object that can be nested up to any level. 它是一个可以嵌套到任何级别的JS对象。 I'm trying to iterate through the object and do some action: 我正在尝试迭代对象并执行一些操作:

Following is my code: 以下是我的代码:

function isLeafNode(node) {
  if (typeof node == typeof "string") {
    return true;
  } else {
    return false;
  }
}

iterateObject(jsonData);

function iterateObject(obj) {
  for (var key in jsonData) {
    if (jsonData.hasOwnProperty(key)) {
      if(!isLeafNode(jsonData[key])){
        iterateObject(jsonData[key])
      }else{
        console.log("leaf node")
        //do something
      }
    }
  }
}

But the above code results in an infinite loop. 但是上面的代码会导致无限循环。 What am I doing wrong? 我究竟做错了什么?

You need to reference the local obj inside of iterateObject instead of the global jsonData . 您需要引用iterateObject的本地obj而不是全局jsonData

 function iterateObject(obj) { for (var key in obj) { if (obj.hasOwnProperty(key)) { if (!isLeafNode(obj[key])) { iterateObject(obj[key]); } else { console.log(key, "leaf node"); } } } } function isLeafNode(node) { return typeof node === "string"; } var data = { sampleA: { sampleB1: { sampleC1: { sample1: "sample", sample2:"sample", sample3:"sample", sample4:"sample", sample5:"sample" },sampleB2: { sample1: "sample", sample2:"sample sample", sample3:"sample", sample4:"sample sample", sample5:"sample sample", sample6:"sample" },sampleB3: { sample1: "sample", sample2:"sample sample", sample3:"sample sample", sample4:"sample sample", sample5:{ sample6: "sample", sample7:"sample sample", sample8:"sample sample", sample9:"sample sample", sample10:"sample", sample11:"sample" },sample100: "sample" } } } }; iterateObject(data); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

There is an issue in your below function 您的以下功能存在问题

function iterateObject(obj) {
  for (var key in jsonData) {
    if (jsonData.hasOwnProperty(key)) {
      if(!isLeafNode(jsonData[key])){
        iterateObject(jsonData[key])
      }else{
        console.log("leaf node")
        //do something
      }
    }
  }
}

It should be like below 它应该如下

function iterateObject(obj) {
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      if(!isLeafNode(obj[key])){
        iterateObject(obj[key])
      }else{
        console.log("leaf node")
        //do something
      }
    }
  }
}

You are using jsonData in loop instead of passed argument obj 您在循环中使用jsonData而不是传递参数obj

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM