【问题标题】:dynamically create elements from object从对象动态创建元素
【发布时间】:2018-06-28 08:19:10
【问题描述】:

我有一个像这样的对象

var nodes = [{
                'name': 'Test1',
                'address': 'Street 1',
                'zipcode': '1234',
                'city': 'Big City',
                'phone': '12345678',
                'email': 'test@test.com',
                'web': 'www.test.com'
            },
            {
                'name': 'Test12',
                'address': 'Street 5',
                'zipcode': '5678',
                'city': 'Bigger City',
                'phone': '89898989',
                'email': 'test2@test2.com',
                'web': 'www.test2.com'
            }
        ]

我想要的是遍历这个对象并从值中动态创建一个带有 textNode 的 span 元素,并使用类的键

var elm = document.createElement('span')
elm.appendChild(document.createTextNode(THEVALUE))
elm.setAttribute('class', THEKEY)
li.appendChild(elm)

目前我正在使用基本的 for 循环,但我不确定仅提取密钥的最佳方法

for (var i = 0; i < nodes.length; i++) {
   var elm = document.createElement('span')
   elm.appendChild(document.createTextNode(nodes[i]))
   li.appendChild(elm)
}

预期的结果是

<span class="name">Test1</span>
<span class="address">Street 1</span>

我正在使用香草 JS

【问题讨论】:

  • 预期的输出是什么样的? class 是什么意思? &lt;span class="name"&gt;Test&lt;/span&gt;&lt;span class="address"... 还是什么?
  • 啊抱歉!编辑了我的问题

标签: javascript html object for-loop


【解决方案1】:

你应该使用for...in作为内部循环,这将让你遍历每个节点的属性:

for (var i = 0; i < nodes.length; i++) {
   var node = nodes[i];
   for(var key in node){
      var elm = document.createElement('span')
      elm.appendChild(document.createTextNode(node[key]))
      elm.className = key;
      li.appendChild(elm)
   }
}

Here is a working example,虽然你想将所有节点追加到同一个列表项似乎有点奇怪。

【讨论】:

    【解决方案2】:

    您可以使用Object.entries 进行迭代以同时获取键和值。当元素的唯一子节点将成为文本节点时,分配给textContent 可能比显式创建文本节点更简洁且可能更好:

    var nodes = [{
      'name': 'Test1',
      'address': 'Street 1',
      'zipcode': '1234',
      'city': 'Big City',
      'phone': '12345678',
      'email': 'test@test.com',
      'web': 'www.test.com'
      },
      {
      'name': 'Test12',
      'address': 'Street 5',
      'zipcode': '5678',
      'city': 'Bigger City',
      'phone': '89898989',
      'email': 'test2@test2.com',
      'web': 'www.test2.com'
      }
    ]
    const ul = document.querySelector('ul');
    nodes.forEach(node => {
      const li = ul.appendChild(document.createElement('li'));
      for (const [key, val] of Object.entries(node)) {
        const span = document.createElement('span');
        span.className = key;
        span.textContent = val;
        li.appendChild(span);
      }
    });
    console.log(ul.innerHTML);
    &lt;ul&gt;&lt;/ul&gt;

    【讨论】:

      【解决方案3】:

      如果你想要这样的输出

      <span class="name">Test1</span>
      <span class="address">Street 1</span>
      

      那就试试这个

      for (var i = 0; i < nodes.length; i++) {
         for(var val in nodes[i]){
            var elem = document.createElement('span')
            elem.appendChild(document.createTextNode(nodes[i][val]))
            elem.className = val;
            console.log(elem)
         }
      }
      

      【讨论】:

        【解决方案4】:

        这会对你有所帮助。

        var nodes = [{
                        'name': 'Test1',
                        'address': 'Street 1',
                        'zipcode': '1234',
                        'city': 'Big City',
                        'phone': '12345678',
                        'email': 'test@test.com',
                        'web': 'www.test.com'
                    },
                    {
                        'name': 'Test12',
                        'address': 'Street 5',
                        'zipcode': '5678',
                        'city': 'Bigger City',
                        'phone': '89898989',
                        'email': 'test2@test2.com',
                        'web': 'www.test2.com'
                    }
                ];
        
        var list = document.getElementById("list");
        for (var i = 0, length=nodes.length; i < length; i++)
        {
            var node = nodes[i];
            Object.keys(node).forEach(function(key){
                var elm = document.createElement('span');
                elm.appendChild(document.createTextNode(node[key]));
                elm.setAttribute('class', key)
                list.appendChild(elm);
            })
        }
        
        console.log(list.innerHTML)
        &lt;div id="list"&gt;&lt;/div&gt;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-15
          • 2016-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多