如何使用Map对象

时间:2017-09-28 05:45:17

标签: javascript arrays data-structures ecmascript-6

我需要保存有关人员的有序数据,我应该根据从服务器获取的数据进行更新。现在,在客户端构建数据的方式:

匿名对象数组:

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个嵌套循环。 一个循环将迭代服务器数组,并且对于每次迭代,我将通过迭代搜索其对应的。像这样:

// 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);
  });

总结实际问题:

  1. clientData定义为Map并享受是一个有效的用例 访问者的好处就像我正在处理Object和 迭代就像我在处理Array
  2. 对该用例使用Map有什么缺点?如果有的话
  3. 我错过了这个问题的其他方法吗?

1 个答案:

答案 0 :(得分:0)

您始终可以通过以下方式访问Javascript对象中的值:

clientData[key]

所以"带有acessors的物体接近"可以像这样循环:

for(var i in clientData) {
    console.log(i + " = " + clientData[i].employed) 
}