我正在尝试了解ES6 Map数据结构,并且难以理解其某些行为。我想创建一个以数组作为值的Map,并将新值附加(推)到Map的当前值上。例如:
let m = new Map()
m.set(1, []) // []
m.set(1, m.get(1).push(2)) // [[1, 1]]
对于为什么我没有得到[2]
作为上面的m.get(1)
的值,我感到困惑。如何将值附加到地图中的数组?
答案 0 :(得分:4)
这是因为方法push
返回插入后的数组大小。
您可以将代码更改为以下内容以附加到数组:
m.get(1).push(2);
它会更新地图中的值,因为将值作为参考传递回去,所以无需再次尝试重新设置值。
答案 1 :(得分:1)
根据需要定义地图的最佳方法是明确告诉地图您要处理的数据类型。
如果您要在数组中输入值,例如可以使用“字符串ID”
在这种情况下,您将拥有这个:
let map = new Map<String, Array<any>>
然后您可以创建类似map["key"] = ["lol", 1, null]
答案 2 :(得分:1)
有两件事。首先,如@ Adriani6所说,push方法不会返回指向数组的指针,而是返回数组的大小。
第二,您不需要执行其他m.set
,因为您的推送将直接影响m.get
返回的引用后面的数组
function displayMap(m) {
m.forEach(function(val, key) {
console.log(key + " => " + val);
});
}
let m = new Map();
m.set(1, []);
displayMap(m);
m.get(1).push(20);
displayMap(m);
答案 3 :(得分:0)
失败,因为push()
的返回值是推送后数组的大小。
您可以在执行get()
之后推送内容。
m.get(1).push(2);
如果要测试set()
,请编写如下的自我可执行函数:
let m = new Map()
m.set(1, []) // []
console.log(m.get(1))
m.set(1, (() => {m.get(1).push(2);return m.get(1);})());
console.log(m.get(1))
答案 4 :(得分:0)
Here's a working example of what you are trying to do(打开控制台)
看看here。如您所见,push方法返回刚突变的数组的新长度,因此返回结果。