本系列翻译自开源项目 30-seconds-of-code 这是一个非常优秀的系列,不是说真的三十秒就能理解,也需要你认真的思考,其中有一些点非常精妙,很值得一读。 本文在我的github同步更新,点击文章末尾阅读全文你可以看到当前翻译的全部系列。 如果您对本期有不同或者更好的见解,请后台留言,喜欢请点个好看,谢谢阅读。
创建一个可以接收n个参数的函数, 忽略其他额外的参数。
调用提供的函数 fn
,参数最多为n个, 使用 Array.prototype.slice(0,n)
和展开操作符 ( ...
)。
const ary = (fn, n) => (...args) => fn(...args.slice(0, n));
示例
const firstTwoMax = ary(Math.max, 2);
[[2, 6, 'a'], [8, 4, 6], [10]].map(x => firstTwoMax(...x)); // [6, 8, 10]
给定一个key和一组参数,给定一个上下文时调用它们。主要用于合并。
使用闭包调用上下文中key对应的值,即带有存储参数的函数。
const call = (key, ...args) => context => context[key](...args);
示例
Promise.resolve([1, 2, 3])
.then(call('map', x => 2 * x))
.then(console.log); // [ 2, 4, 6 ]
const map = call.bind(null, 'map');
Promise.resolve([1, 2, 3])
.then(map(x => 2 * x))
.then(console.log); // [ 2, 4, 6 ]
将一个接收数组参数的函数改变为可变参数的函数。
给定一个函数,返回一个闭包,该闭包将所有输入收集到一个数组接受函数中。
const collectInto = fn => (...args) => fn(args);
示例
const Pall = collectInto(Promise.all.bind(Promise));
let p1 = Promise.resolve(1);
let p2 = Promise.resolve(2);
let p3 = new Promise(resolve => setTimeout(resolve, 2000, 3));
Pall(p1, p2, p3).then(console.log); // [1, 2, 3] (after about 2 seconds)
Flip以一个函数作为参数,然后把第一个参数作为最后一个参数。
返回一个可变参数的闭包,在应用其他参数前,先把第一个以外的其他参数作为第一个参数。
const flip = fn => (first, ...rest) => fn(...rest, first);
示例
let a = { name: 'John Smith' };
let b = {};
const mergeFrom = flip(Object.assign);
let mergePerson = mergeFrom.bind(null, a);
mergePerson(b); // == b
b = {};
Object.assign(b, a); // == b
创建一个函数,这个函数可以调用每一个被传入的并且才有参数的函数,然后返回结果。
使用 Array.prototype.map()
和 Function.prototype.apply()
将每个函数应用给定的参数。
const over = (...fns) => (...args) => fns.map(fn => fn.apply(null, args));
示例
const minMax = over(Math.min, Math.max);
minMax(1, 2, 3, 4, 5); // [1,5]