javascript - 获取Map.prototype.forEach()中的索引

时间:2016-07-11 18:14:58

标签: javascript dictionary ecmascript-6

Map.prototype.forEach使用两个参数进行回调:值和键。 是否可以获取每个条目的索引,类似于Array.prototype.forEach((value, index) => {})

3 个答案:

答案 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;
  }
}