首先,我将一张地图填写为:
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));
答案 0 :(得分:3)
objectKey
是"4000"
,而不是4000
(类型为number
){p>
这应该有效:
dict.get("en").get("4000")
任何值(对象值和原始值)都可以用作键
还有
密钥相等性基于
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)
-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];
}));