ES6 将可迭代转换为数组时间复杂度

Posted

技术标签:

【中文标题】ES6 将可迭代转换为数组时间复杂度【英文标题】:ES6 Convert iterable to array time complexity 【发布时间】:2019-05-07 05:46:07 【问题描述】:

我想知道将可迭代对象(例如 MapIterator)转换为数组的时间复杂度是多少。 假设我有这个代码:

    const Component = ( map ) => 
           return (
        <Fragment>
            Array.from(map.values()).map(item => <div key=item.key>item.name</div>)
       </Fragment>
     )

每个 Array.from() 的时间复杂度是多少,是我想的 O(n) 还是因为它的 MapIterator 以某种方式更快地从类数组转换为数组。

我的用例是我想将项目(需要访问的)保存为性能问题的映射,但我必须将它们作为数组运行。

出于这个问题的目的,我可以保存状态或使用选择器或类似的东西

你们觉得呢?

【问题讨论】:

如果您关心性能,最好不要将任何内容转换为数组,只需将数据作为可迭代对象处理,将所有处理逻辑直接应用于可迭代对象。这是一个可以处理的库 - iter-ops. 【参考方案1】:

Array.from() 是 O(n) 是正确的。如果您担心性能,您可以做的最简单的改进就是不要将值迭代两次Array.from() 已经接受 map 函数作为第二个可选参数:

Array.from(map.values(), ( key, name ) => <div key=key>name</div>)

【讨论】:

我不知道这是一个有效的语法。阅读文档我看到了 mapFn,很酷!所以将可迭代对象转换为数组必须像我想的那样是 O(n) 吧?这实际上解决了我的特殊问题,因为我必须映射值,所以我已经不得不花费 O(n)。 是的,一个迭代器在 O(n) 时间内被消耗,Array.from() does not have any special cases for builtin types that are O(1) in the specification.

以上是关于ES6 将可迭代转换为数组时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

ES6 扩展运算符

将数组转换为 ES6 可迭代

将分而治之的递归算法转换为迭代版本

如何将可映射数组转换为 JSON?

ES6 生成器:将回调转换为迭代器

将复杂对象转换为数组