为什么我不能按键获取Map元素?

时间:2019-05-07 10:02:33

标签: javascript

首先,我将一张地图填写为:

let words = new Map();
let response = [{ 4000: { text: "Ok" } }, { 5000: { text: "Ok" } }];

response.forEach(d => {
    let objectKey = Object.keys(d).pop();
    words.set(objectKey, d[objectKey]);
});

然后我创建一个新地图,并通过键prev Map words进行设置:

let dict = new Map();
dict.set('en', words);

为什么我不能通过连锁电话获得价值?

console.log(dict.get("en").get(4000));

2 个答案:

答案 0 :(得分:3)

objectKey"4000",而不是4000(类型为number){p>

这应该有效:

dict.get("en").get("4000")

来自documentation

  

任何值(对象值和原始值)都可以用作键

还有

  

密钥相等性基于sameValueZero算法:NaN被认为与NaN相同(即使NaN!== NaN),而所有其他值根据==的语义被认为是相等的。 =运算符

因此,“ 4000”和4000被视为单独的键。

const map = new Map

map.set("4000", "value1")
map.set(4000, "value2")

console.log([...map.entries()])

访问对象的属性后,它会被强制为字符串。但是使用Map并没有完成

答案 1 :(得分:1)

  

Object的键是StringSymbol

-MDN

从对象(即let objectKey = Object.keys(d).pop();)获取密钥时,它是字符串,而不是您最初在对象中定义的数字。

您需要将其转换为数字,以使其按预期工作:

let objectKey = Number(Object.keys(d).pop());

工作示例:

let words = new Map();
let response = [{ 4000: { text: "Ok" } }, { 5000: { text: "Ok" } }];

response.forEach(d => {
    let objectKey = Number(Object.keys(d).pop());
    words.set(objectKey, d[objectKey]);
});

let dict = new Map();
dict.set('en', words);

console.log(dict.get("en").get(4000));

另一方面,您还可以简化创建words地图对象的过程。

const words = new Map(response.map(d => {
  const [id, val] = Object.entries(d).shift();
  return [Number(id), val];
}));