【30秒一个知识点】Adapter(一)

时间:2022-06-21
本文章向大家介绍【30秒一个知识点】Adapter(一),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本系列翻译自开源项目 30-seconds-of-code 这是一个非常优秀的系列,不是说真的三十秒就能理解,也需要你认真的思考,其中有一些点非常精妙,很值得一读。 本文在我的github同步更新,点击文章末尾阅读全文你可以看到当前翻译的全部系列。 如果您对本期有不同或者更好的见解,请后台留言,喜欢请点个好看,谢谢阅读。

ary

创建一个可以接收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]

call

给定一个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 ]

collectInto

将一个接收数组参数的函数改变为可变参数的函数。

给定一个函数,返回一个闭包,该闭包将所有输入收集到一个数组接受函数中。

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

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

over

创建一个函数,这个函数可以调用每一个被传入的并且才有参数的函数,然后返回结果。

使用 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]