[英]JavaScript: Successively calling a list of functions on an object
假設我有一個存儲在數組中的函數列表:
var myFunctions = [
function (i) {return i + 2},
function (i) {return i * 2},
function (i) {return i - 3}
]
連續調用所有這些函數 object 的最佳方法是什么,即得到((n + 2) * 2) - 3
作為結果?
歡迎使用Underscore等外部庫的答案:)
數組也是JavaScript對象。 在您的情況下,您創建了一個數組及其三個屬性,即f1
, f2
和f3
。 相反,您只需
var myFunctions = [
function(i) {
return i + 2
},
function(i) {
return i * 2
},
function(i) {
return i - 3
}
];
現在我們有了一個函數數組,我們可以使用Array.prototype.reduce
函數像這樣應用這些函數
var result = myFunctions.reduce(function(result, currentFunction) {
return currentFunction(result);
}, n);
n
是要傳遞給要應用的功能列表的實際初始值。 reduce
接受初始值和第一個函數,並將它們分別作為result
和currentFunction
傳遞。 我們對result
應用currentFunction
並返回值。 在下一次迭代中,返回值將是result
,而currentFunction
將是第二個函數,依此類推。
如果您不喜歡函數式方法,則可以簡單地使用for循環,如下所示
var i = 0, result = 0, n = 10;
for (var i = 0; i < myFunctions.length; i += 1) {
n = myFunctions[i](n);
}
使用折疊(減少):
var n = 5;
var myFunctions = [
function (i) {return i + 2},
function (i) {return i * 2},
function (i) {return i - 3}
];
n = myFunctions.reduce(function(n, fn) { return fn(n) }, n);
n; // => 11 ((5 + 2) * 2 - 3)
使用功能組合 :
var myFunctions = [
function (i) {return i - 3},
function (i) {return i * 2},
function (i) {return i + 2}
];
_.compose.apply(null, myFunctions)(5); // => 11
請注意,在此第二個示例中,功能是相反的順序,按照慣例,首先應用鏈中的最后一個功能。
通過匿名小號function lifting傳遞@Sacha的原始需求和@thefourtheye的回答,可以表達為:
const inception = 42; // or anything you prefer really.
const modifiers = [
i => i - 3,
i => i * 2,
i => i + 2
];
// Apply successively each generated function on its predecessor result,
// taking inception as initial origin.
modifiers.reduce((origin, transform) => transform(origin), inception)
另請注意此代碼段如何僅使用常量,這更好地反映了源參數永遠不會改變的事實。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.