箭头lambda和es6中的其他功能简化了功能风格的写作js,包括currying
我正在测试array map
的实施,但我遇到了一个问题:
这是我的实施:
let map = fn => a => a.length ? [fn(a[0]), ...map(fn)(a.slice(1))] : [];
let plus_10 = map(n => n+10);
plus_10([1,2,3]); // [11, 12, 13]
但是,此实现在每次迭代时重新创建array_mapper函数...map(fn)
捕获array_mapper函数并在所有迭代中引用它会很好 这是一个有效的实施方案:
let map = fn => {
let array_mapper = a => a.length ? [fn(a[0]), ...array_mapper(a.slice(1))] : [];
return array_mapper;
};
但是这会制动fp的可读性和整洁性 我做了,只是为了测试,另一个(尽管是丑陋的)实现,但它不是语法有效:
let map = fn => (let array_mapper = a => a.length ? [fn(a[0]), ...array_mapper(a.slice(1))] : [], array_mapper);
任何线索?
编辑:
关于...spread
表演的说明:
使用10000大小的数组在chrome中测试此映射函数需要11秒!
但使用.concat
代替传播...
let map = fn => a => a.length ? [fn(a[0])].concat(map(fn)(a.slice(1))) : [];
执行时间降至600毫秒