For/In 遍历 JavaScript 数据

For/In Loop through JavaScript Data

在被重定向到类似问题之前: 我查看了相关问题。我明白了。我似乎无法将它正确地应用到我的特定代码中。

我正在尝试使用 Javascript 显示 JSON 数据。它工作得很好。然后又加了一层,现在完全迷路了

最初,我有我的总体数据 (1)、我的 3 个条目 (2) 以及每个条目的 3 个属性 (3)。

我是这样抓取数据的:

var objDisplay = document.getElementById('myDiv');

for (key1 in this.jsonObj){ 

    for (var x = 0; x < this.jsonObj[key1].length; x++){ 
        var objEntry = document.createElement('div'); 

        for (key2 in this.jsonObj[key1][x]){

            var sPropertyData = this.jsonObj[key1][x][key2]; 
            var objProperty = document.createElement('div');
            objProperty.appendChild(document.createTextNode(sPropertyData));
            objEntry.appendChild(objProperty);

        }

        objDisplay.appendChild(objEntry);
    }

}

现在我想将条目增加三倍并将它们分成几个部分,所以我将拥有我的总体数据 (1)、我的 3 个部分 (2)、每个部分的 3 个条目 (3) 以及第 3 个每个条目的属性 (4)。我还想在单独的 div 中显示每个部分。

我知道根据我的基础可能很容易得出答案,但我现在无法想象它,我的尝试导致了......奇怪的结果。有帮助吗?

编辑:新的数据对象,其中每个字母是一个节

{
    "ABC": [

        {"A": 
            [
                { "1" : "A1-1", "2" : "A1-2", "3" : "A1-3"},
                { "1" : "A2-1", "2" : "A2-2", "3" : "A2-3" },
                { "1" : "A3-1", "2" : "A3-2", "3" : "A3-3" }
            ]
        },

        {"B": 
            [
                { "1" : "B1-1", "2" : "B1-2", "3" : "B1-3"},
                { "1" : "B2-1", "2" : "B2-2", "3" : "B2-3" },
                { "1" : "B3-1", "2" : "B3-2", "3" : "B3-3" }
            ]
        },

        {"C": 
            [
                { "1" : "C1-1", "2" : "C1-2", "3" : "C1-3"},
                { "1" : "C2-1", "2" : "C2-2", "3" : "C2-3" },
                { "1" : "C3-1", "2" : "C3-2", "3" : "C3-3" }
            ]
        }
    ]
}

edit 2: 预期输出(不要介意class名字,仅供参考)

<div id="myDiv">
  <div class="section">
    <div class="entry">
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
    </div>
    <div class="entry">
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
    </div>
    <div class="entry">
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
    </div>
  </div>
  <div class="section">
    <div class="entry">
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
    </div>
    <div class="entry">
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
    </div>
    <div class="entry">
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
    </div>
  </div>
  <div class="section">
    <div class="entry">
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
    </div>
    <div class="entry">
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
    </div>
    <div class="entry">
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
        <div class="property">stringified json data</div>
    </div>
  </div>
</div>

我唯一需要的文本数据是最低级别的值,但我需要能够使用更高级别的样式(请参阅初始代码中创建的 divs)。

不要使用 for in 循环遍历对象,而是使用数组 forEach 和 object.keys。否则,您会忘记迭代最内层的对象。但是,无论您嵌套多深,递归函数都可以使它工作,假设您保持相同的结构 Object > Array > Object > String

var jsonObj = {
  "ABC": [

    {
      "A": [{
        "1": "A1-1",
        "2": "A1-2",
        "3": "A1-3"
      }, {
        "1": "A2-1",
        "2": "A2-2",
        "3": "A2-3"
      }, {
        "1": "A3-1",
        "2": "A3-2",
        "3": "A3-3"
      }]
    },

    {
      "B": [{
        "1": "B1-1",
        "2": "B1-2",
        "3": "B1-3"
      }, {
        "1": "B2-1",
        "2": "B2-2",
        "3": "B2-3"
      }, {
        "1": "B3-1",
        "2": "B3-2",
        "3": "B3-3"
      }]
    },

    {
      "C": [{
        "1": "C1-1",
        "2": "C1-2",
        "3": "C1-3"
      }, {
        "1": "C2-1",
        "2": "C2-2",
        "3": "C2-3"
      }, {
        "1": "C3-1",
        "2": "C3-2",
        "3": "C3-3"
      }]
    }
  ]
};
var objDisplay = document.getElementById('myDiv');

function recurse(obj, level) {
  console.log(level);
  var div = document.createElement('div');
  switch (level) {
    case 1:
      div.className = 'section';
      break;
    case 2:
      div.className = 'entry';
      break;
    case 3:
      div.className = 'property';
      break;
  }
  Object.keys(obj).forEach(function(key) {
    if (typeof obj[key] === 'string') {
      var prop = document.createElement('div');
      prop.className = 'property';
      var tempObj = {};
      tempObj[key] = obj[key]
      prop.appendChild(document.createTextNode(JSON.stringify(tempObj)))
      div.appendChild(prop);
      return;
    }
    obj[key].forEach(function(obj) {
      div.appendChild(recurse(obj,level + 1));
    });
  });
  return div;
}

objDisplay.appendChild(recurse(jsonObj,0));
.section {
  border: 1px solid green;
  margin: 5px;
  padding: 5px;
}
.entry {
  border: 1px solid blue;
  margin: 5px;
  padding: 5px;
}
.property {
  border: 1px solid yellow;
  margin: 5px;
  padding: 5px;
}
<div id="myDiv"></div>