将数组转换为迭代器

Convert array to iterator

如何将数组转换为迭代器,以便我可以同时调用 nextdone 来迭代数组的值?

我已经详尽地看到了

an array is an iterable

但它也没有 属性 (const a = [1,2,3]; a.done; // returns undefined)。

我试过直接访问 Symbol.iterator (const iter = a[Symbol.iterator];),但它只是 returns function values() 数组。

您可以使用.entries()方法。

const a = [1, 2, 3];

const iterator = a.entries();

console.log(iterator.next().value, iterator.next().done);

或者,我可以调用从 Symbol.iterator:

返回的函数
const iter = a[Symbol.iterator]();
const first = iter.next();

我的误解是done在迭代器上,但它在节点上,可以称为first.done


受约翰回答的启发,我发现了数组上的 values() 方法(这是 Symbol.iterator 在 Jax-p 的回答中返回的方法),它的行为几乎相同,但删除了解构步骤。总结答案:

const a = [1,2,3];

const symbolIterator = a[Symbol.iterator];
const firstSymbolValue = symbolIterator.next();

const valuesIterator = a.values();
const firstValuesValue = valuesIterator.next();

const entriesIterator = a.entries();
const [firstEntriesIndex, firstEntriesValue] = entriesIterator.next();

expect(firstSymbolValue).toBe(1);
expect(firstValuesValue).toBe(1);
expect(firstEntriesValue).toBe(1);

我不确定你想用 a.done 得到什么,但是当调用 next() 时,doneiterable protocol 的 return 对象中。

你是对的 a[Symbol.iterator] returns value() function as it is described at MDN Web Docs Array.prototype[@@iterator]() 但这正是你想要遍历时所需要的带迭代器的数组。你可以看下面的例子:

const arr = [1,2,3];
const eArr = arr[Symbol.iterator]();
console.log(eArr.next().done);
console.log(eArr.next().done);
console.log(eArr.next().done);
console.log(eArr.next().done);

使用 .values() 方法,它 returns 数组元素的迭代器。