2016-05-12 47 views
2

如何通過避免在JavaScript中重複這樣的函數創建來編寫這段代碼更多的功能?爲了給出一個上下文,我試圖找到是否已經實現了從當前值到最終值的移動。如果移動趨向於較高的值,則deltaValue爲正,如果朝向較低的值則爲負。避免重複使用JS中的高階函數?

if (deltaValue > 0) { 
    maxPossibleValue = function(current, final) { 
     return current > final ? final : current; 

    } 
} else { 
    maxPossibleValue = function(current, final) { 
     return current < final ? final : current; 
    } 
} 

假設存在着<>的功能,在JavaScript ltgt,我可能只是一個單一的功能,其中predicateltgt處理高階函數評估了此。但是,JS本身沒有這樣的函數,上面的方法也是唯一的方法嗎?

maxPossibleValue = function(predicate) { 
    return function(c, f) { 
     return predicate(c, f) ? c : f } 
} 

這可以被認爲是模板化所需謂詞函數並返回一個新函數。我在Scheme中看到過這樣的模式。

+1

你試圖做這樣的事情? maxPosibleValue(function(c,f){return c> f;})(c,f); – dlopez

+0

這是否達到目標?儘管我可以用一個邏輯來翻轉變量並達到我想要的。 – Nishant

+1

我寫過的內聯函數是您似乎需要的一種方法(當deltaValue大於0時)。顯然你可以每次改變函數的邏輯來獲得你想要的行爲。 – dlopez

回答

1

您已經有一個機制滿足您的要求,Math.minMath.max

的代碼看起來是這樣,但maxPossibleValue是missleading

var maxPossibleValue = function (predicate) { 
     return function (c, f) { 
      return predicate(c, f) 
     } 
    }, 
    comparer = maxPossibleValue(deltaValue > 0 ? Math.min : Math.max); 

工作示例:在正確的方向,但Math.max

var deltaValue = -1; 
 
var maxPossibleValue = function (predicate) { 
 
     return function (c, f) { 
 
      return predicate(c, f) 
 
     } 
 
    }, 
 
    comparer = maxPossibleValue(deltaValue > 0 ? Math.min : Math.max); 
 

 
document.write(comparer(2, 8));

+0

你有沒有函數名稱的備用建議?我在轉換函數的上下文中使用了'maxPossibleValue',這是我在這裏做的。或者好吧,也許你的意思是它與'Math.max'衝突:) – Nishant

+1

也許'applyPredicate'? –

+1

'Math.max'和'Math.min'不是謂詞。函數(c,f){返回謂詞(c,f); }'簡化爲'predicate'(eta reduction) – naomik

2

@龔如心的答案你點和Math.min不是謂詞。答案過於複雜。

我看不出爲什麼答案應該是更難跟蹤比這

function calculateValue(delta, final, current) { 
    return (delta > 0 ? Math.min : Math.max)(final, current); 
} 

calculateValue(-1, 5, 10); // 10 
calculateValue(1, 5, 10); // 5 
+0

我同意。我覺得我剛剛開始時過於複雜,Nina通過找到Math.min,Math.max函數來修復它的一部分。但我認爲它的微妙*重要*知道我正在處理Math.min和Math.max,而不是爲此編寫一些自定義邏輯:) – Nishant

+1

@Nishant作爲函數,您對'lt'和'gt'沒有錯誤無論是。 JavaScript把這些當作操作符而不是函數來吸引。我將它們定義爲'const <=; y => y y => y> x;'......以及JavaScript決定實現的無數其他函數運營商。 – naomik

+0

希望他們把這添加到語言:) – Nishant