将可迭代的 Javascript 转换为数组

2022-08-30 00:54:06

我正在尝试使用Javascript EC6中的新Map对象,因为它已经在最新的Firefox和Chrome版本中得到支持。

但我发现它在“函数式”编程中非常有限,因为它缺乏经典的map,filter等方法,这些方法可以很好地与一对一起使用。它有一个 forEach,但不返回回调结果。[key, value]

如果我能将它从MapIterator转换为一个简单的数组,我就可以使用标准,而无需额外的黑客攻击。map.entries().map.filter

有没有一种“好”的方法可以将Javascript迭代器转换为数组?在python中,它就像做一样简单...但返回一个数组,迭代器作为其第一个元素!!!list(iterator)Array(m.entries())

编辑

我忘了指定我正在寻找一个答案,无论Map在哪里工作,这意味着至少Chrome和Firefox(Array.from在Chrome中不起作用)。

附言。

我知道有梦幻般的wu.js但它对tracer的依赖让我失望了......


答案 1

您正在寻找新的 Array.from 函数,它将任意可迭代转换为数组实例:

var arr = Array.from(map.entries());

它现在在Edge,FF,Chrome和Node 4 +中受支持

当然,可能值得直接在迭代器接口上定义 和类似的方法,这样就可以避免分配数组。您可能还希望使用生成器函数而不是高阶函数:mapfilter

function* map(iterable) {
    var i = 0;
    for (var item of iterable)
        yield yourTransformation(item, i++);
}
function* filter(iterable) {
    var i = 0;
    for (var item of iterable)
        if (yourPredicate(item, i++))
             yield item;
}

答案 2

[...map.entries()]Array.from(map.entries())

这超级简单。

无论如何 - 迭代器缺乏减少,过滤和类似的方法。你必须自己编写它们,因为它比将Map转换为数组并返回更有效。但不要做跳转 Map -> Array -> Map -> Array -> Map -> Array,因为这会扼杀性能。