循环遍历 JSON 中的嵌套数组值,将这些值附加到生成的 html 中
Looping through nested array vaues in JSON, appending those values to generated html
已编辑:
我(仍然)在从 JSON 中的嵌套数组中获取值并将它们附加到生成的 html 时遇到了一些麻烦。
我目前正在使用以下 JSON(已更新):
{
"OuterArray": [
{
"memberId": "01",
"key01": "",
"included": "true",
"nestedArray": [
{ "keyA": "", "keyB": "" },
{ "keyA": "", "keyB": "" }
]
},
{
"memberId": "02",
"key01": "",
"included": "true",
"nestedArray": [
{ "keyA": "", "keyB": "" },
{ "keyA": "", "keyB": "" }
]
},
{
"memberId": "03",
"key01": "",
"included": "false",
"nestedArray": [
{ "keyA": "", "keyB": "" },
{ "keyA": "", "keyB": "" }
]
},
{
"memberId": "04",
"key01": "",
"included": "true",
"nestedArray": [
{ "keyA": "", "keyB": "" },
{ "keyA": "", "keyB": "" }
]
}
]
}
而这个js:
for (var i = 0; i < outerArray.length; i++) {
if (outerArray[i].included !== "false") {
var key01 = outerArray[i].key01;
var key02 = outerArray[i].key02;
// etc.
var nestedArray = outerArray[i]["nestedArray"];
myDiv.innerHTML +=
"<div class='"outer-array-stuff'">"
+ "<p class='"key01'">" + key01 + "</p>"
+ "<p class='"key02'">" + key02 + "</p>"
+ "<div class='"nested-array-stuff'">" // help?
+ "</div>"
+ "</div>"
var nestedArrayStuff = document.getElementsByClassName("nested-array-stuff")[i];
for (var j=0; j<outerArray.length; j++) {
nestedArrayStuff.innerHTML += "<p class='"keyA'">" + nestedArray[j].keyA + "</p>";
}
}
请注意,外部数组中的一个键具有一个布尔值,该值确定它(外部数组成员)是否包含在页面中,并且其嵌套数组内容是否包含在页面中。
所以重申一下,目标是:
<div class="outer-array-stuff">
<!-- <snip: some outer array key/values here /> -->
<div class="nested-array-stuff">
<div class="nested-array-stuff">
<p>[e.g., nested array key 1 value]</p>
<p>[e.g., nested array key 2 value]</p>
<p>[etc.]</p>
</div>
</div>
如果所有"包含"的外部数组成员都是"true",则所有外部和嵌套都会加载,但这并不完全是我想要的;我需要过滤,以便只有那些"包含"!=="假"。所以现在我的问题是,尽管在 if 'include'/else 循环内,但外部数组成员在第一个排除的外部数组成员处停止加载(实际上,下一个"真正的"外部数组成员确实加载,但其嵌套数组内容没有,然后没有进一步加载,整个外部数组循环死亡。
关于为什么会发生这种情况的任何见解?
非常感谢德雷斯猫对这一点的帮助。
附言:一般来说,我试图尽量减少对jQuery的依赖。
非常感谢,svs
你快到了。这是您的代码经过一些注释的修订。
// Generally is not a good practice iterate arrays using for..in
//for (var i in outerArray) {
for (var i = 0; i < outerArray.length; i++) {
var key01 = outerArray[i].key01;
var key02 = outerArray[i].key02;
// This should by outerArray array and not jsonData object.
var nestedArray = outerArray[i]["nestedArray"];
myDiv.innerHTML +=
"<div class='"outer-array-stuff'">"
+ "<p class='"key01'">" + key01 + "</p>"
+ "<p class='"key02'">" + key02 + "</p>"
+ "<div class='"nested-array-stuff'">" // help?
+ "</div>"
+ "</div>"
// getElementsByClassName gets a list of elements that have that class.
// I suppose you want to add the elements to the corresponding outer array.
// Let's use the loop index i to get the proper parent element. You could also
// just get the last one.
var nestedArrayStuff = document.getElementsByClassName("nested-array-stuff")[i]; // help?
// Again I recommend you not to use for..in for arrays.
for (var obj in nestedArray) {
nestedArrayStuff.innerHTML += "<p class='"keyA'">" + nestedArray[obj].keyA + "</p>"; // NOPE
}
}
请参阅演示。
您还可以在将嵌套数组添加到div 元素之前构建整个嵌套数组的内容。然后,您无需查询文档即可获取嵌套数组 stuff 元素。
for (var i in outerArray) {
var key01 = outerArray[i].key01;
var key02 = outerArray[i].key02;
var nestedArray = outerArray[i]["nestedArray"];
var nestedArrayStuff = '<div class='"nested-array-stuff'">';
for (var obj in nestedArray) {
nestedArrayStuff += "<p class='"keyA'">" + nestedArray[obj].keyA + "</p>"; // NOPE
}
nestedArrayStuff += '</div>';
myDiv.innerHTML += "<div class='"outer-array-stuff'">"
+ "<p class='"key01'">" + key01 + "</p>"
+ "<p class='"key02'">" + key02 + "</p>"
+ nestedArrayStuff
+ "</div>"
+ "</div>";
}
查看演示
nestedArray
不是字符串。 您的nestedArray
数组循环应如下所示。
var nestedArray = outerArray[i].nestedArray;
for (var j in nestedArray) {
console.log(nestedArray[j].keyA);
console.log(nestedArray[j].keyB);
}
这是您的完整解决方案,我使用列表来输出内容。它假设我们有一个容器:
<div id="mydiv"></div>
比JS将是:
var myDiv = document.getElementById('mydiv');
var outerArray = [
{
"memberId":"01",
"key01":"",
"key02":"key02 exists, ...",
"included":"true",
"nestedArray":[
{
"keyA":"1",
"keyB":"2"
},
{
"keyA":"3",
"keyB":"4"
}
]
},
{
"memberId":"02",
"key01":"key01 value..",
"included":"true",
"nestedArray":[
{
"keyA":"5",
"keyB":""
},
{
"keyA":"",
"keyB":"8"
}
]
},
{
"memberId":"03",
"key02":"",
"included":"false",
"nestedArray":[
{
"keyA":"",
"keyB":"9"
},
{
"keyA":"",
"keyB":""
}
]
},
{
"memberId":"04",
"key01":"value of key01",
"key02":"key02 value ...",
"included":"true",
"nestedArray":[
{
"keyA":"",
"keyB":"10"
},
{
"keyA":"11",
"keyB":"12"
}
]
}
];
var insertHtml = '';
for (var i = 0; i < outerArray.length; i++) {
if (outerArray[i].included !== "false") {
insertHtml += "<ul class='"outer-array-stuff'">";
insertHtml += " <li>";
insertHtml += " <p class='"memberId'">memberId(" + i + "): " + outerArray[i].memberId + "</p>"
insertHtml += " <p class='"key01'">key01: " + ( ( typeof outerArray[i].key01!='undefined' && outerArray[i].key01 ) ? outerArray[i].key01 : '') + "</p>"
insertHtml += " <p class='"key02'">key02: " + ( ( typeof outerArray[i].key02!='undefined' && outerArray[i].key02 ) ? outerArray[i].key02 : '') + "</p>"
var nestedArray = outerArray[i]["nestedArray"];
if ( nestedArray.length>0 ) {
insertHtml += " <ul class='"nested-array-stuff'">"
for (var j=0; j<nestedArray.length; j++) {
insertHtml += "<li class='"keyA'">keyA(" + j + "): " + nestedArray[j].keyA + "</li>";
insertHtml += "<li class='"keyB'">keyB(" + j + "): " + nestedArray[j].keyB + "</li>";
};
insertHtml += " </ul>"
};
insertHtml += " </li>";
insertHtml += "</ul>"
}
}
myDiv.innerHTML = insertHtml;
相关文章:
- 如何将json数据显示为html
- 如何将JSON转换为HTML下拉菜单
- AngularJS加载JSON数据,然后从中解析/加载HTML
- 如何在html angular中显示嵌套的json元素
- 从JSON填充列表(而不是HTML)
- 在HTML页面上将URL解析为可读的json格式
- tu如何将id放在填充了json数据的html表td上
- 嵌套JSON到平面HTML表
- http请求使用html而不是json进行响应
- 如何在带有nunjucks和gullow数据的JSON数据中使用带有HTML的内容
- 使用Angular显示JSON中的HTML
- 如何使用jQuery来解析json并将其作为列表输出到HTML中
- 通过Azure存储以HTML形式获取JSON文件
- ngResource没有'从JSON文件解析HTML时不起作用
- JavaScript-HTML表单到JSON(空值)和格式
- 使用 HTML JSON 进行调试
- jQuery获取text/html/json与脚本
- 测试字符串是否以.html|.html|.json结尾
- HTML Json解析字符串
- 如何编写一个HTML JSON AJAX测试工具与美化,语法突出显示JSON结果