将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+ 。
当然,直接在迭代器接口上定义map
, filter
和类似的方法可能是值得的,这样可以避免分配数组。 你也可能想使用一个生成器函数而不是高阶函数:
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
对象创buildmap
和filter
函数:
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>