我正在映射函数内映射一个数组,并且我想将数组内每个元素的 id 添加到一个状态。我面临的问题是,即使控制台日志显示函数迭代到正确的次数,也仅将最后一项添加到数组中。
这是我写的代码
const { evc } = this.props;
evc.chargingStationGroups && evc.chargingStationGroups.map((item, key) => {
item.stations.map((stationItem, key) => {
console.log("stationID ",stationItem.stationID);
var stationId = {};
stationId = {
stationId: stationItem.stationID
}
var allIdArray = this.state.stationIdArray.concat(stationId);
this.setState({ stationIdArray: allIdArray })
})
})
这里evc.chargingStationGroups
是这样的
[
{
groupId: "16",
groupName: "Sia",
stations: [{stationId: "8", name: "Test"},{stationId: "9", name: "Test2"},{stationId: "10", name: "Test3"}]
},
{
groupId: "17",
groupName: "Maroon5",
stations: [{stationId: "10", name: "Test"},{stationId: "11", name: "Test2"},{stationId: "10", name: "Test3"}]
}
],
如何将所有 stationItem.stationID
添加到我的数组中,而不仅仅是最后一个。
最佳答案
仅在所有渲染中调用 setState
一次(因为 setState
是异步的)
假设你在chargingStationGroups之间没有重复的站点,只需将每个人连接起来即可
const { evc } = this.props;
if (evc.chargingStationGroups) {
const ids = evc.chargingStationGroups.flatMap((item, key) => {
return item.stations.map((stationItem, key) => {
return {
stationId: stationItem.stationID
}
})
})
const stationIdArray = this.state.stationIdArray.concat(ids)
this.setState({ stationIdArray })
})
否则就避免上当受骗...
const { evc } = this.props;
if (evc.chargingStationGroups) {
const ids = evc.chargingStationGroups.flatMap((item, key) => {
return item.stations.map((stationItem, key) => {
return {
stationId: stationItem.stationID
}
})
})
const arr = this.state.stationIdArray.concat(ids)
const s = new Set(arr.map(x => x.stationID))
const stationIdArray = [...s].map(stationId => ({ stationId }))
this.setState({ stationIdArray })
})
未测试,因为没有给出最小的可重现示例,但您明白了...
关于javascript - 仅最后一项添加到映射函数内的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59451955/