为什么这些循环不同

Why are these loops different?

本文关键字:循环 为什么      更新时间:2023-09-26

我正在我的网站上工作,当我遇到一些奇怪的事情时,我正在通过ajax从数据库中获取数据,然后我使用一些循环来更新表中的数据。这是我第一次尝试循环

for(var id in data){
    for(var key in data[id])
        for(var e in document.getElementsByName(key+id))
            e.innerHTML = data[id][key] !== null ? data[id][key] : "";

我本以为这会毫无问题地奏效,但事实并非如此。表中没有任何字段被更新,我也不知道为什么。然后我决定用一些更传统的东西来测试,最终得到了这个。

for(var id in data){
    for(var key in data[id]){
        var temp = document.getElementsByName(key+id);
        for(var i=0; i<temp.length; i++)
            temp[i].innerHTML = data[id][key] !== null ? data[id][key] : "";
    }

这非常有效,但我不明白为什么,因为从我所看到的来看,循环应该做同样的事情。所以我想知道,为什么它们不同,我该如何修复它。我喜欢代码中的一致性,不想使用for(var i=0; i<temp.length; i++),因为我以前使用过其他类型的循环。

document.getElementsByName(key+id)返回一个数组。语法for(var x in y)迭代对象/数组中的名称。对象中的名称是键,数组中的名称则是索引。

因此,上一个循环中的e将为0,1,2,3,长度。。。。

第一次尝试时,var edocument.getElementsByName(key+id) 的索引

尝试

for(var id in data){
    for(var key in data[id]){
        var elements = document.getElementsByName(key+id);
        for(var e in elements)
            var elem = elements[e];
            elem.innerHTML = data[id][key] !== null ? data[id][key] : "";
        }

在第一个例子中,您犯了两个错误。

  1. 不要为arrays运行for .. in。因为您不会对索引进行迭代,还会对属性进行迭代
  2. 在您的情况下,e不是元素,而是索引。为什么它不起作用