Map.prototype.entries()返回按插入顺序排列的[key, value]迭代器;可通过手动计数、解构赋值或封装生成器实现索引感知遍历,适用于调试、分页及构建带序号列表等场景。

Map.prototype.entries() 返回一个迭代器,每次产出 [key, value] 数组;它本身不带索引,但配合 for...of 时,你可以手动维护一个计数器,实现“索引感知”的遍历流——即在遍历时同时获知当前是第几轮(从 0 开始或从 1 开始均可)。
用 let 声明并递增索引变量
最直接的方式是在 for...of 外声明一个索引变量,在每次循环中递增它:
const map = new Map([['a', 1], ['b', 2], ['c', 3]]);
let index = 0;
for (const [key, value] of map.entries()) {
console.log(`索引 ${index}: ${key} → ${value}`);
index++;
}
// 输出:
// 索引 0: a → 1
// 索引 1: b → 2
// 索引 2: c → 3
用 for...let 配合解构 + 索引(更函数式风格)
如果想避免外部变量、提升可读性与作用域控制,可以把索引作为循环内局部变量处理。虽然 for...of 本身不支持内置索引,但你可以用数组解构 + 手动计数封装成更紧凑的形式:
const map = new Map([['x', 'red'], ['y', 'green'], ['z', 'blue']]);
let i = 0;
for (const entry of map.entries()) {
const [key, value] = entry;
console.log(`第 ${i + 1} 项: ${key} = ${value}`);
i++;
}
这种写法把“索引语义”显式暴露在日志或逻辑中,适合调试、分页、条件跳过等场景。
封装为可复用的带索引迭代器(进阶)
若频繁需要索引感知,可封装一个生成器函数,让每次产出变成 [index, key, value]:
#${idx} ${k}: ${v}注意:entries() 的顺序是插入顺序,索引即插入位置
Map 保证 entries() 按键值对的插入顺序返回,因此你的“索引”天然对应元素的插入序号,可用于:
- 构建带序号的列表 UI(如配置项预览)
- 在满足某条件时提前跳出,并知道已处理几项
- 将 Map 转为带索引的对象数组:
Array.from(map.entries(), ([k, v], i) => ({ i, k, v }))










