簡體   English   中英

JavaScript:連續調用 object 上的函數列表

[英]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對象。 在您的情況下,您創建了一個數組及其三個屬性,即f1f2f3 相反,您只需

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接受初始值和第一個函數,並將它們分別作為resultcurrentFunction傳遞。 我們對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM