javascript中无内置enumerate,可用for...of配合自定义迭代器模拟:核心是迭代器返回[index, value]数组;推荐用生成器函数实现,简洁且支持任意可迭代对象。

JavaScript 中没有内置的 enumerate,但可以用 for...of 配合自定义迭代器轻松模拟——核心是让迭代器每次返回 [index, value] 形式的数组。
手动封装一个 enumerate 函数
最直接的方式是写一个高阶函数,接收可迭代对象,返回一个支持 for...of 的新迭代器:
- 利用
Symbol.iterator创建自定义迭代器对象 - 内部用闭包维护索引计数器,每次
next()返回{ value: [i, item], done: false } - 遇到
done: true时停止
示例:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
function enumerate(iterable) {
const iterator = iterable[Symbol.iterator]();
let index = 0;
return {
[Symbol.iterator]() { return this; },
next() {
const { value, done } = iterator.next();
if (done) return { value: undefined, done: true };
return { value: [index++, value], done: false };
}
};
}
<p>// 使用
for (const [i, char] of enumerate('abc')) {
console.log(i, char); // 0 'a', 1 'b', 2 'c'
}</p>用生成器函数更简洁地实现
生成器天然适合封装迭代逻辑,代码更易读、更符合直觉:
-
function*内部用yield逐个产出[index, item] - 自动处理
Symbol.iterator和状态管理 - 支持任意可迭代对象(数组、字符串、Set、Map 等)
示例:
function* enumerate(iterable) {
let i = 0;
for (const item of iterable) {
yield [i++, item];
}
}
<p>// 使用
for (const [i, v] of enumerate(['x', 'y', 'z'])) {
console.log(i, v); // 0 'x', 1 'y', 2 'z'
}</p>兼容 Map 和 Set 的注意事项
Map 和 Set 的默认迭代行为和数组不同,需注意:
- Map 默认迭代的是
[key, value]键值对,不是值本身;若想枚举“第几个键值对”,直接用enumerate(map)即可 - Set 默认迭代的是值,
enumerate(set)返回的是[index, element] - 如果对 Map 想同时拿到序号、key、value,可解构:
for (const [i, [key, val]] of enumerate(myMap))
一行式简写(适合简单场景)
如果只是临时需要,不追求复用性,可用 Array.from + 索引映射:
-
Array.from(array, (v, i) => [i, v])生成索引-值数组,再for...of - 优点:短小、无需定义函数;缺点:会一次性展开全部元素,不适用于无限或大体积迭代器
示例:
const arr = ['a', 'b', 'c'];
for (const [i, v] of Array.from(arr, (val, idx) => [idx, val])) {
console.log(i, v);
}
不复杂但容易忽略细节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










