处理数组和 ES6 迭代器的混合

Posted

技术标签:

【中文标题】处理数组和 ES6 迭代器的混合【英文标题】:Dealing with a mix of Arrays and ES6 Iterators 【发布时间】:2021-09-03 21:46:57 【问题描述】:

所以我从 Python 开始使用 javascript,但在操作序列时遇到了一些摩擦。

在 python 中,reduce 之类的东西是一个全局函数,它可以接受任何类型的序列。这很棒,因为我不需要根据我正在处理的值是列表还是生成器来更改我的代码。

在 javascript 中,reduceArray 的一个方法。

特别是在使用Maps 之类的东西时,我经常使用Iterator 而不是Array

我最初的想法是,“啊哈!我可能应该使用 lodash,我确信这些函数不在乎我拥有什么样的 Iterable”。结果 lodash 期望得到Arrays,所以对我没有帮助!

我的挣扎是否表明做了一些不是惯用 javascript 的事情?还是javascript的整个Iterator方面还是有点不成熟?

我应该将所有Iterators 标准化为Arrays 吗?还是我想保留 Iterators 是对的?

【问题讨论】:

您可以使用Array.from[...iterator] 将迭代器转换为数组。你能提供一些迭代器的例子吗? 你可以考虑使用 RxJS 及其操作符 (reduce in particular),这对类型非常友好。是的,如果你真的不关心异步,你总是可以将迭代器转换为数组。 有a proposal for iterable helpers 但不幸的是,它还没有准备好。它看起来确实像您正在寻找的东西。现在,您正在寻找一些像 map<T, U>(it: Iterable<T>, fn: (x: T) => U) 这样的函数,它们可以对其进行迭代操作。您可以自己轻松编写它们。 “寻找一些指导。我应该使用一个流行的库,它对 TypeScript 友好,可以解决我所有的问题吗?” - 这对 SO 来说是题外话。 @VLAZ 该提案完全总结了我正在努力解决的问题,并且“现有技术”部分看起来可能对解决方案有一些有用的指导......谢谢! 【参考方案1】:

方法一:Array.from

Array.from(iterator).reduce

方法二:传播

[...iterator].reduce

方法三:编写一些全局辅助函数

const map = (func,iterator) => 
    let result = [];
    for (let value of iterator) 
        result.push(func(value))
    
    return result;


const reduce = (func,iterator,init) => 
    // I'm not about to write my own reduce implementation here
    return [...iterator].reduce(func,init);

那你就可以更接近python了

【讨论】:

以上是关于处理数组和 ES6 迭代器的混合的主要内容,如果未能解决你的问题,请参考以下文章

ES6中的迭代器(Iterator)和生成器(Generator)

python 11 函数名 迭代器

带有向量迭代器的程序中的分段错误

如何复制只有两个迭代器的数据?

PHP中for和foreach背后发生了什么和关于迭代器的理解

ES6 从入门到精通 # 14:迭代器 Iterator 的用法