将Javascript迭代器转换为数组

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

但是在“function”编程中,我发现它非常有限,因为它缺less经典的映射,filter等方法,可以很好地与[key, value]对配合使用。 它有一个forEach,但不会返回callback结果。

如果我可以将map.entries()从MapIterator转换成简单的Array,那么我可以使用标准的.map.filter ,而不需要额外的黑客。

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

编辑

我忘了指定我正在寻找一个适用于地图工作的答案,这意味着至lessChrome和Firefox(Array.from在Chrome中不起作用)。

PS。

我知道那里有很棒的wu.js,但是它对traceur的依赖使我感到很失望。

您正在寻找新的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; } 

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

这是超级简单。

无论如何 – 迭代器缺乏减less,过滤和类似的方法。 你必须自己写,因为它比将Map转换成数组更好。 但是不要做跳转Map – > Array – > Map – > Array – > Map – > Array,因为它会杀死性能。

没有必要将一个Map转换成一个Array 。 您可以简单地为Map对象创buildmapfilter函数:

 function map(functor, object, self) { var result = new Map; object.forEach(function (value, key, object) { result.set(key, functor.call(this, value, key, object)); }, self); return result; } function filter(predicate, object, self) { var result = new Map; object.forEach(function (value, key, object) { if (predicate.call(this, value, key, object)) result.set(key, value); }, self); return result; } 

例如,你可以附加一个bang(ie !字符)到键值为一个原语的映射的每个条目的值。

 var object = new Map; object.set("", "empty string"); object.set(0, "number zero"); object.set(object, "itself"); var result = map(appendBang, filter(primitive, object)); alert(result.get("")); // empty string! alert(result.get(0)); // number zero! alert(result.get(object)); // undefined function primitive(value, key) { return isPrimitive(key); } function appendBang(value) { return value + "!"; } function isPrimitive(value) { var type = typeof value; return value === null || type !== "object" && type !== "function"; } 
 <script> function map(functor, object, self) { var result = new Map; object.forEach(function (value, key, object) { result.set(key, functor.call(this, value, key, object)); }, self || null); return result; } function filter(predicate, object, self) { var result = new Map; object.forEach(function (value, key, object) { if (predicate.call(this, value, key, object)) result.set(key, value); }, self || null); return result; } </script>