【问题标题】:Convert array to iterator将数组转换为迭代器
【发布时间】:2021-08-26 10:51:18
【问题描述】:

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

我已经看得很透彻了

数组是可迭代的

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

我尝试直接访问Symbol.iterator (const iter = a[Symbol.iterator];),但它只是为数组返回function values()

【问题讨论】:

标签: javascript iterator


【解决方案1】:

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

const a = [1, 2, 3];

const iterator = a.entries();

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

【讨论】:

  • 谢谢约翰!尽管更令人愉快,entries 方法并没有像Symbol.iterator 那样回答问题,因为每个值都返回[index, value](例如,const iterator = [1,2,3].entries(); iterator.next(); 给出[0, 1]
【解决方案2】:

或者,我可以调用从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);

【讨论】:

    【解决方案3】:

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

    您是对的,a[Symbol.iterator] 返回 value() 函数,正如 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);

    【讨论】:

    • 嘿 Jax,看看我的回答,我哪里出错了。关于done属性,它是用来检查迭代是否已经结束,所以我想要done属性来检查迭代是否完成。不幸的是,我处于功能上(使用setInterval)无法使用循环迭代的情况,必须通过调用next,然后检查done
    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 2021-04-21
    • 2012-05-07
    • 2018-09-28
    • 2011-09-02
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多