代码之家  ›  专栏  ›  技术社区  ›  Sooraj

JS对象:迭代到第n级

  •  1
  • Sooraj  · 技术社区  · 7 年前

    我有以下示例对象:

    {
       "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"
             }
          }
       }
    }
    

    它是一个JS对象,可以嵌套到任何级别。我正在尝试遍历对象并执行一些操作:

    以下是我的代码:

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

    但是上面的代码会导致无限循环。我做错了什么?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Nina Scholz    7 年前

    您需要引用本地 obj 的内部 iterateObject 而不是全球 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; }
        2
  •  1
  •   Alpesh Jikadra    7 年前

    以下函数中存在问题

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

    应该如下所示

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

    您正在使用 jsonData公司 在循环中而不是传递的参数 obj