Map.prototype.forEach
使用两个参数进行回调:值和键。
是否可以获取每个条目的索引,类似于Array.prototype.forEach((value, index) => {})
答案 0 :(得分:10)
Map.prototype.forEach
使用两个参数进行回调:值和键。
不,它是invoked with three arguments,就像Array#forEach
一样。第三个是地图。
是否可以获取每个条目的索引,类似于
Array.prototype.forEach(functcion(value, index) => {})
(相当确定functcion
部分并不意味着在那里。)
那就是key
。没有单独的“索引”。
Map
的迭代顺序是为各种迭代操作定义的,但没有直接迭代构造为您提供索引(与相对) >键)该订单中的条目。订单是原始密钥插入顺序,例如:
const m = new Map();
m.set("x", 1);
m.set("q", 2);
m.set("z"), 3);
m.set("x", "one");
如果我们遍历该地图,我们会按照按键第一次的顺序看到按键,因此"x"
,"q"
,"z"
。请注意,使用ke "x"
更改条目的值不会将其移动到最后。
Map#forEach
(和for-of
以及使用地图迭代器的任何其他内容)遵循迭代顺序,因此如果您根据该顺序考虑索引,则可以自己跟踪索引:
const m = new Map();
m.set("one", "uno");
m.set("two", "due");
m.set("three", "tre");
let index = 0;
m.forEach((value, key) => {
console.log(index++, key, value);
});
或者,您可以获取一个映射条目数组(作为[key, value]
数组):
let entries = Array.from(m.entries());
...并使用该数组的索引:
我只是不确定它买了什么。 : - )
答案 1 :(得分:1)
我不这么认为。地图对象是键/值映射。至少对于我来说,索引的概念没有多大意义,因为在Map中不能保证键/值对的顺序。如果你只是好奇你到目前为止已经迭代了多少对,你可以保留一个你在每次调用时都会变异的计数器,例如:
mapObj.forEach(() => {
let i=0;
return (key, value) => {
// whatever you are doing with each key/value
i += 1;
}
});
它不像参数那样优雅,但至少可以满足您的需求。
答案 2 :(得分:0)
问题在于定义索引是什么。规范定义了迭代器的[[MapNextIndex]]内部槽,它存储包含下一个条目的[[MapData]]列表的索引。
但是,无法访问这些索引。更重要的是,实现不需要像规范所描述的内部行为,因此它们可能根本没有这些索引。
此Map对象规范中使用的数据结构仅是 旨在描述Map对象所需的可观察语义。 它并不是一个可行的实施模型。
你可以做的是使用一个索引,该索引说明你需要在新迭代器上调用next()
多少次才能获得该条目。这些索引不是绝对的,如果您更改地图可能会过时。只需将计数器初始化为0
,并在每次迭代时增加它。
{
let i = 0;
for(var [key,value] of map) {
// Do something
++i;
}
}