无需编写迭代函数,如何映射JavaScript可迭代对象?
解决方案
1. 快速将可迭代对象转为数组
完全不用自己写循环函数,JavaScript原生就有现成方法能把可迭代对象转成数组,转完就能直接用Array.prototype.map():
方法一:Array.from()
Array.from()直接接收可迭代对象作为参数,返回对应的数组,甚至还能直接传入映射函数一步到位:
const myMap = new Map([['a', 1], ['b', 2]]); // 先转数组再映射 const valuesArray = Array.from(myMap.values()); const mappedValues = valuesArray.map(val => val * 2); // [2, 4] // 直接在转数组时完成映射 const mappedValuesDirect = Array.from(myMap.values(), val => val * 2); // [2, 4]
方法二:展开运算符(...)
用展开运算符可以把可迭代对象的元素直接展开到数组字面量里:
const myMap = new Map([['a', 1], ['b', 2]]); const valuesArray = [...myMap.values()]; const mappedValues = valuesArray.map(val => val + 1); // [2, 3]
2. 不转数组,直接映射可迭代对象
如果担心转数组占用内存(比如处理超大可迭代对象),可以用生成器写一个适配可迭代对象的map函数,不用先把所有元素加载到内存:
function iterableMap(iterable, mapper) { return (function* () { for (const item of iterable) { yield mapper(item); } })(); } // 使用示例 const myMap = new Map([['a', 1], ['b', 2]]); const mappedIterable = iterableMap(myMap.values(), val => val * 3); // 遍历新的可迭代对象 for (const val of mappedIterable) { console.log(val); // 3, 6 }
关于你写的realize函数
你手写的realize函数本质是手动实现数组转换逻辑,但原生的Array.from()和展开运算符已经做了同样的事,而且是经过优化的原生实现,代码更简洁、性能也更好,完全没必要自己写。
内容的提问来源于stack exchange,提问作者intuited
相关产品推荐
相关产品推荐

