摘要:給定一個(gè)函數(shù),返回一個(gè)閉包,該閉包將所有輸入收集到一個(gè)數(shù)組接受函數(shù)中。返回一個(gè)可變參數(shù)的閉包,在應(yīng)用其他參數(shù)前,先把第一個(gè)以外的其他參數(shù)作為第一個(gè)參數(shù)。
本系列翻譯自開(kāi)源項(xiàng)目 30-seconds-of-codeary這是一個(gè)非常優(yōu)秀的系列,文章總結(jié)了大量的使用es6語(yǔ)法實(shí)現(xiàn)的代碼模塊不是說(shuō)真的三十秒就能理解,也需要你認(rèn)真的思考,其中有一些點(diǎn)非常精妙,很值得一讀。
本文在我的github同步更新,你可以看到當(dāng)前翻譯的全部系列。
如果您對(duì)本期有不同或者更好的見(jiàn)解,請(qǐng)?jiān)谙路皆u(píng)論告,喜歡請(qǐng)點(diǎn)個(gè)贊,謝謝閱讀。
創(chuàng)建一個(gè)可以接收n個(gè)參數(shù)的函數(shù), 忽略其他額外的參數(shù)。
調(diào)用提供的函數(shù)fn,參數(shù)最多為n個(gè), 使用 Array.prototype.slice(0,n) 和展開(kāi)操作符 (...)。
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
給定一個(gè)key和一組參數(shù),給定一個(gè)上下文時(shí)調(diào)用它們。主要用于合并。
使用閉包調(diào)用上下文中key對(duì)應(yīng)的值,即帶有存儲(chǔ)參數(shù)的函數(shù)。
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
將一個(gè)接收數(shù)組參數(shù)的函數(shù)改變?yōu)榭勺儏?shù)的函數(shù)。
給定一個(gè)函數(shù),返回一個(gè)閉包,該閉包將所有輸入收集到一個(gè)數(shù)組接受函數(shù)中。
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以一個(gè)函數(shù)作為參數(shù),然后把第一個(gè)參數(shù)作為最后一個(gè)參數(shù)。
返回一個(gè)可變參數(shù)的閉包,在應(yīng)用其他參數(shù)前,先把第一個(gè)以外的其他參數(shù)作為第一個(gè)參數(shù)。
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); // == bover
創(chuàng)建一個(gè)函數(shù),這個(gè)函數(shù)可以調(diào)用每一個(gè)被傳入的并且才有參數(shù)的函數(shù),然后返回結(jié)果。
使用 Array.prototype.map() 和 Function.prototype.apply()將每個(gè)函數(shù)應(yīng)用給定的參數(shù)。
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]overArgs
創(chuàng)建一個(gè)函數(shù),它可以調(diào)用提供的被轉(zhuǎn)換參數(shù)的函數(shù)。
使用Array.prototype.map()將transforms應(yīng)用于args,并結(jié)合擴(kuò)展運(yùn)算符(…)將轉(zhuǎn)換后的參數(shù)傳遞給fn。
const overArgs = (fn, transforms) => (...args) => fn(...args.map((val, i) => transforms[i](val)));
示例
const square = n => n * n; const double = n => n * 2; const fn = overArgs((x, y) => [x, y], [square, double]); fn(9, 3); // [81, 6]pipeAsyncFunctions
為異步函數(shù)執(zhí)行從左到右的函數(shù)組合。
在擴(kuò)展操作符(…)中使用Array.prototype.reduce() 來(lái)使用Promise.then()執(zhí)行從左到右的函數(shù)組合。
這些函數(shù)可以返回簡(jiǎn)單值、Promise的組合,也可以定義為通過(guò)await返回的async值。
所有函數(shù)必須是一元的。
const pipeAsyncFunctions = (...fns) => arg => fns.reduce((p, f) => p.then(f), Promise.resolve(arg));
示例
const sum = pipeAsyncFunctions( x => x + 1, x => new Promise(resolve => setTimeout(() => resolve(x + 2), 1000)), x => x + 3, async x => (await x) + 4 ); (async() => { console.log(await sum(5)); // 15 (after one second) })();pipeFunctions
執(zhí)行從左到右的函數(shù)組合。
在展開(kāi)操作符(…)中使用Array.prototype.reduce()來(lái)執(zhí)行從左到右的函數(shù)組合。
第一個(gè)(最左邊的)函數(shù)可以接受一個(gè)或多個(gè)參數(shù); 其余的函數(shù)必須是一元的。
const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));
示例
const add5 = x => x + 5; const multiply = (x, y) => x * y; const multiplyAndAdd5 = pipeFunctions(multiply, add5); multiplyAndAdd5(5, 2); // 15promisify
把一個(gè)異步函數(shù)轉(zhuǎn)換成返回promise的。
使用局部套用返回一個(gè)函數(shù),該函數(shù)返回一個(gè)調(diào)用原始函數(shù)的Promise。
使用的...操作符來(lái)傳入所有參數(shù)。
const promisify = func => (...args) => new Promise((resolve, reject) => func(...args, (err, result) => (err ? reject(err) : resolve(result))) );
示例
const delay = promisify((d, cb) => setTimeout(cb, d)); delay(2000).then(() => console.log("Hi!")); // Promise resolves after 2srearg
創(chuàng)建一個(gè)調(diào)用提供的函數(shù)的函數(shù),該函數(shù)的參數(shù)按照指定的索引排列。
利用 Array.prototype.map() 根據(jù) indexes 和展開(kāi)操作符 (...) 對(duì)參數(shù)進(jìn)行重新排序,將轉(zhuǎn)換后的參數(shù)傳遞給 fn.
const rearg = (fn, indexes) => (...args) => fn(...indexes.map(i => args[i]));
示例
var rearged = rearg( function(a, b, c) { return [a, b, c]; }, [2, 0, 1] ); rearged("b", "c", "a"); // ["a", "b", "c"]spreadOver
接受一個(gè)可變參數(shù)函數(shù)并返回一個(gè)閉包,該閉包接受一個(gè)參數(shù)數(shù)組以映射到函數(shù)的輸入。
使用閉包和擴(kuò)展操作符(…)將參數(shù)數(shù)組映射到函數(shù)的輸入。
const spreadOver = fn => argsArr => fn(...argsArr);
示例
const arrayMax = spreadOver(Math.max); arrayMax([1, 2, 3]); // 3unary
創(chuàng)建一個(gè)最多接受一個(gè)參數(shù)的函數(shù),忽略任何其他參數(shù)。
只把第一個(gè)參數(shù)傳遞給要調(diào)用的函數(shù)fn。
const unary = fn => val => fn(val);
示例
["6", "8", "10"].map(unary(parseInt)); // [6, 8, 10]推薦閱讀
【React深入】setState的執(zhí)行機(jī)制
【React深入】React事件機(jī)制
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102447.html
摘要:在社區(qū)開(kāi)發(fā)的一些最新工具集的幫助下,出現(xiàn)了四步流程法,從而進(jìn)一步加快了開(kāi)發(fā)效率。兩步流程法傳統(tǒng)上來(lái)說(shuō),智能合約開(kāi)發(fā)有兩步開(kāi)發(fā)流程編碼和測(cè)試。四步工作流程法開(kāi)發(fā)智能合約對(duì)于編輯和調(diào)試階段,我建議使用兩種方法和。 摘要:開(kāi)發(fā)NEO智能合約的典型開(kāi)發(fā)流程有兩個(gè)實(shí)際階段:編碼(在IDE中編碼并將源碼編譯為.avm文件)以及測(cè)試(在測(cè)試網(wǎng)上部署、調(diào)用、檢查結(jié)果)。這個(gè)工作流需要編譯和部署來(lái)調(diào)試任...
摘要:在社區(qū)開(kāi)發(fā)的一些最新工具集的幫助下,出現(xiàn)了四步流程法,從而進(jìn)一步加快了開(kāi)發(fā)效率。兩步流程法傳統(tǒng)上來(lái)說(shuō),智能合約開(kāi)發(fā)有兩步開(kāi)發(fā)流程編碼和測(cè)試。四步工作流程法開(kāi)發(fā)智能合約對(duì)于編輯和調(diào)試階段,我建議使用兩種方法和。 摘要:開(kāi)發(fā)NEO智能合約的典型開(kāi)發(fā)流程有兩個(gè)實(shí)際階段:編碼(在IDE中編碼并將源碼編譯為.avm文件)以及測(cè)試(在測(cè)試網(wǎng)上部署、調(diào)用、檢查結(jié)果)。這個(gè)工作流需要編譯和部署來(lái)調(diào)試任...
摘要:自己因?yàn)榻?jīng)常遇到這種場(chǎng)景,所以將其封裝成一個(gè)庫(kù),方便使用。如何使用使用簡(jiǎn)單,只需要要在方法上面加一個(gè)裝飾器即可緩存,并且設(shè)置緩存過(guò)期時(shí)間。以上即可,第一次運(yùn)行需要秒,第二次運(yùn)行過(guò)期時(shí)間秒之內(nèi)瞬間給出緩存結(jié)果。適合于小場(chǎng)景的方法緩存。 A python Function / Method OUTPUT cache system base on function Decorators. 基...
摘要:自己因?yàn)榻?jīng)常遇到這種場(chǎng)景,所以將其封裝成一個(gè)庫(kù),方便使用。如何使用使用簡(jiǎn)單,只需要要在方法上面加一個(gè)裝飾器即可緩存,并且設(shè)置緩存過(guò)期時(shí)間。以上即可,第一次運(yùn)行需要秒,第二次運(yùn)行過(guò)期時(shí)間秒之內(nèi)瞬間給出緩存結(jié)果。適合于小場(chǎng)景的方法緩存。 A python Function / Method OUTPUT cache system base on function Decorators. 基...
摘要:英文文章來(lái)源于給定一個(gè)鍵值和一組參數(shù),但給定一個(gè)上下文時(shí)調(diào)用它們。 英文文章來(lái)源于:https://github.com/Chalarangelo/30-seconds-of-code/blob/master/README.md Adapter call 給定一個(gè)鍵值和一組參數(shù),但給定一個(gè)上下文時(shí)調(diào)用它們。 使用閉包調(diào)用存儲(chǔ)的鍵值與存儲(chǔ)的參數(shù) const call = ( key, ....
閱讀 3212·2021-11-08 13:18
閱讀 1365·2021-10-09 09:57
閱讀 1197·2021-09-22 15:33
閱讀 3996·2021-08-17 10:12
閱讀 5079·2021-08-16 11:02
閱讀 2693·2019-08-30 10:56
閱讀 975·2019-08-29 18:31
閱讀 3263·2019-08-29 16:30