【发布时间】:2017-09-28 05:45:16
【问题描述】:
我需要保存有关人员的有序数据,我应该根据从服务器获取的数据进行更新。现在在客户端构建数据的方式:
匿名对象数组:
const clientData = [{
id: 1,
employed: true
},
{
id: 2,
employed: false
},
{
id: 3,
employed: true
},
{
id: 4,
employed: false
}
]
来自服务器的数据如下所示:
const serverData = [
{
id: 2,
newEmployedStatus: true
},
{
id: 3,
newEmployedStatus: false
},
]
那样,更新我的集合会迫使我使用 2 个嵌套循环。 一个循环将遍历服务器数组,并且对于每次迭代,我将 search 其对应的迭代。像这样:
// Very Verbose
serverData.forEach((serverPerson)=> {
clientPerson = clientData.find((element)=> {
return element.id === serverPerson.id
})
clientPerson.employed = serverPerson.newEmployedStatus
})
我想避免那些嵌套循环和复杂的逻辑,所以:
使用访问器方法的对象
const clientData = {
1: {
employed:true
},
2: {
employed:false
},
3: {
employed:true
},
4: {
employed:false
}
}
但是当我想打印它们时,我将无法依赖元素的顺序。
所以,我最近知道了另一种方法:
地图对象
const clientDataMap = new Map(
[
[1, { employed:true }],
[2, { employed:false }],
[3, { employed:true }],
[4, { employed:false }],
]
)
更新clientData 将降低复杂性:
serverData.forEach((serverPerson)=> {
clientDataMap.get(serverPerson.id).employed = serverPerson.newEmployedStatus
})
仍然可以按顺序打印人员:
clientDataMap.forEach((value, key)=> {
console.log(key + ' = ' + value.employed);
});
总结实际问题:
- 将
clientData定义为Map是一个有效的用例,并享受 像我处理Object这样的访问者的好处,以及 像我处理Array一样迭代? - 在该用例中使用
Map有什么缺点?如果有的话 - 我错过了解决此问题的其他方法吗?
【问题讨论】:
标签: javascript arrays data-structures ecmascript-6