【问题标题】:Nested divs from object javascript来自对象 javascript 的嵌套 div
【发布时间】:2018-01-25 08:12:03
【问题描述】:

我有一个对象:

var data = {
    "lay": "h_m_f",
    "h": {
        "par": {
            "first_second": {
                "first": {
                    "module": {
                        "article": {
                            "archivclankyrubrika": "3",
                            "pocetclanku": "10"
                        }
                    }
                },
                "second": {
                }
            }
        },
        "next": {
            "one": {
                "val": {
                }
            },
        }
    },
}
};

我尝试从这个对象构建 html 嵌套 div。如果节点没有子节点,则显示内部文本。但问题是这个脚本不会循环遍历孩子。结果我只有 2 个 div。
我的问题在哪里?感谢您的回答。这是我的脚本:

function create_node(obj){
    var node = document.createElement('div');
    node.setAttribute('class', Object.keys(obj)[0]);
    for (var i in obj) {
        node.appendChild(create_node(obj.i));
    }
    return node;
}
console.log(create_node(jsonTemplate));

更新:对我来说理想的结果:每个对象都是 div,在模块之前有类。模块是最后一个div,模块的cihldren的键显示为文本。

<div class="h">
    <div class="par">
        <div class='first_second'>
            <div class="first">
                 <div class="module">
                     article
                 </div>
            </div>
            <div class="second">
            </div>
        </div>
     </div>
     <div class="next">
         <div class="one">
             <div class="val">
             </div>
         </div>
     </div>
</div>

【问题讨论】:

  • obj.i不正确,应该是obj[i]
  • HTML 应该是什么样的?
  • @SergeK,它会无限循环。
  • @RoryMcCrossan 喜欢&lt;div class="h"&gt;&lt;div class="first_second"&gt;&lt;div class="module"&gt;article&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
  • 那么parfirstarchivclankyrubrika3会发生什么?

标签: javascript jquery html object


【解决方案1】:

如果节点是对象 - 迭代子节点并附加结果,如果不是 - 附加文本:

var jsonTemplate = {"lay":"h_m_f","h":{"par":{"first_second":{"first":{"module":{"article":{"archivclankyrubrika":"3","pocetclanku":"10"}}},"second":{}}},"next":{"one":{"val":{}}}}};

function create_node(value, key){
    var node = document.createElement('div');
    node.setAttribute('class', key || '');
    
    if(key === 'module') {
      Object.keys(value).forEach(function(key) {
        node.appendChild(document.createTextNode(key || ''));
      })
      return node;
    }
    
    if(value && typeof value === 'object') {     
      for (var i in value) {
        node.appendChild(create_node(value[i], i));
      }
    }
    
    return node;
}

root.appendChild(create_node(jsonTemplate));
&lt;div id="root"&gt;&lt;/div&gt;

【讨论】:

  • 请注意null 也是'object'
  • @OriDrori 谢谢您,先生!我有个问题。如果我将键“第二”更改为“第一”。这意味着现在我有 2 个“第一”键。为什么结果中只显示其中一个 - 最后一个?
  • 对象属性名称应该是唯一的。如果您有两个具有相同名称的属性。第二个将覆盖第一个。所以你实际上在对象中只有 1 个“第一”
  • @OriDrori 我能问你吗。是否可以反过来做。我的意思是从 html 构建对象?谢谢
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 2019-11-22
  • 1970-01-01
  • 2012-12-25
  • 2018-01-12
  • 2021-09-10
  • 1970-01-01
  • 2021-07-21
相关资源
最近更新 更多