forEach仅打印最后一个值,在javascript中的典型关闭问题

问题描述:

我尝试使用这种方法作为通常解决任何关闭问题的方式,但显然这不适用于我。我尝试将其更改为letconst或甚至箭头函数,但代码始终打印最后一个数组元素。forEach仅打印最后一个值,在javascript中的典型关闭问题

谁能告诉我什么,我做错了什么:

var data = [{ 
 
    "first_name": "John", 
 
    "last_name": "Doe", 
 
    "phone": "31227-5325" 
 
}, { 
 
    "first_name": "Jane", 
 
    "last_name": "Campbell", 
 
    "phone": "123123-5325" 
 
}]; 
 

 
window.onload = function() { 
 
    console.log('loaded....'); 
 
    data.forEach(function(elem, index) { 
 

 
    let p = index; 
 
    document.querySelector('#fname').innerHTML = '<td>' + data[p].first_name + '</td>'; 
 
    document.querySelector('#lname').innerHTML = '<td>' + data[p].last_name + '</td>'; 
 
    document.querySelector('#phone').innerHTML = '<td>' + data[p].phone + '</td>'; 
 

 
    }) 
 

 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table class="table table-border"> 
 
    <thead> 
 
    <tr> 
 
     <th>First Name</th> 
 
     <th>Last Name</th> 
 
     <th>Phone</th> 
 
    </tr> 
 
    </thead> 
 
    <tr class="tr1"> 
 
    <td id="fname"></td> 
 
    <td id="lname"></td> 
 
    <td id="phone"></td> 
 
    </tr> 
 

 
</table>

http://jsbin.com/gasegeqila/1/edit?js,output

感谢

+1

问题寻求帮助调试(**“为什么不是这个代码的工作?” **)必须包括所期望的行为,一个特定的问题或错误,并在最短的代码要重现它**在问题本身**。没有**明确问题陈述**的问题对其他读者没有用处。请参阅:[如何创建最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。 –

+0

就这样说,你的问题是因为你设置了循环中每个元素的值,所以只有最后一次迭代中设置的值是可见的。您需要在循环中创建一个新行,并在其中设置值 –

+0

您的逻辑本身并没有什么错误,它是您的输出,它写入相同的HTML元素并覆盖以前插入的数据。 – delinear

你的问题,是因为你设置的循环相同元素的值,所以只在最后一次迭代中设置的值是可见的。

你,而不是需要在循环创建一个新的行中设置的值出现,就像这样:

var data = [{ 
 
    "first_name": "John", 
 
    "last_name": "Doe", 
 
    "phone": "31227-5325" 
 
}, { 
 
    "first_name": "Jane", 
 
    "last_name": "Campbell", 
 
    "phone": "123123-5325" 
 
}]; 
 

 
window.onload = function() { 
 
    var tbody = document.querySelector('table tbody'); 
 
    
 
    data.forEach(function(elem, index) { 
 
    var tr = document.createElement('tr'); 
 
    tr.innerHTML = `<td>${data[index].first_name}</td><td>${data[index].last_name}</td><td>${data[index].phone}</td>`; 
 
    tbody.appendChild(tr); 
 
    }) 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table class="table table-border"> 
 
    <thead> 
 
    <tr> 
 
     <th>First Name</th> 
 
     <th>Last Name</th> 
 
     <th>Phone</th> 
 
    </tr> 
 
    </thead> 
 
    <tbody></tbody> 
 
</table>

+0

谢谢你的回答。 – Mike

编辑:

一种方法是创建行一个第二单元分别这样的:

var row = table.insertRow(i + 1); 

var cl1 = row.insertCell(0); 
var cl2 = row.insertCell(1); 
var cl3 = row.insertCell(2); 

cl1.innerHTML = data[i].first_name; 
cl2.innerHTML = data[i].last_name; 
cl3.innerHTML = data[i].phone; 

工作例如:https://jsfiddle.net/dkppcdtz/1/

+0

我不想追加,我想为每个值插入一个新行 – Mike

+0

编辑答案.. –

代码总是打印最后一个数组元素?

Docs

的ID全局属性定义一个唯一的标识符(ID) 必须是在整个文档中是唯一的。

从您的脚本:

document.querySelector('#fname').innerHTML = ...; 
document.querySelector('#lname').innerHTML = ...; 
document.querySelector('#phone'). = ..... 

你总是有新的one.So更换您的数据,则最后一个元素得到更新。

您可以循环就是这样,

var table = document.querySelector('.table.table-border'); 

data.forEach(function(elem, index) { 

    let p = index; 
    let newRowHtml = '<tr><td>' + data[p].first_name + '</td>' + 
        '<td>' + data[p].last_name + '</td>' + 
        '<td>' + data[p].phone + '</td></tr>'; 


    table.insertAdjacentHTML('afterend', newRowHtml); 

}) 

您可以使用array#reduce创建您行字符串,然后将生成的字符串添加到您的表身。

var data = [{ 
 
    "first_name": "John", 
 
    "last_name": "Doe", 
 
    "phone": "31227-5325" 
 
}, { 
 
    "first_name": "Jane", 
 
    "last_name": "Campbell", 
 
    "phone": "123123-5325" 
 
}]; 
 

 
window.onload = function() { 
 
    console.log('loaded....'); 
 
    var row = data.reduce(function(str, elem, index) { 
 
    let p = index; 
 
    str += '<tr><td>' + data[p].first_name + '</td><td>' + data[p].last_name + '</td><td>' + data[p].phone + '</td></tr>'; 
 
    return str; 
 
    }, ''); 
 
    document.querySelector('table tbody').innerHTML = row; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table class="table table-border"> 
 
    <thead> 
 
    <tr> 
 
     <th>First Name</th> 
 
     <th>Last Name</th> 
 
     <th>Phone</th> 
 
    </tr> 
 
    </thead> 
 
    <tbody class="tr1"> 
 
    </tbody> 
 

 
</table>