2015-10-12 42 views
1

我很抱歉,如果這已被問及之前,但我找不到任何關於我可以想到的任何關鍵字。javascript查看錶在初始化之前或之後執行函數嗎?

我有一個數組中的JavaScript,我想這取決於模式我在確定其最小/最大價值,所以我有一個函數:

function arrayMinMax(array, mode) { 
    // return min/max value from 1D array 
    return { 
    0: Math.min.apply(null, array), 
    1: Math.max.apply(null, array) 
    }[mode] 
} 

我的問題是:當此功能稱爲,既是最小值和最大值的計算值,也是僅用mode選擇的最小值或最大值的值?如果前者與後者相比會有不好的表現。

+0

都被計算。執行如你所見,首先形成一個對象,然後返回一個特定的對象關鍵元素 – guramidev

+2

爲了得到後者,將它們包裝在函數中:'return {0:function(){return Math.min.apply(null ,array); },...} [mode]()' – RJo

+3

RJO的解決方案很好,但我認爲這個對象在這裏根本不需要。它只是添加一個額外的層來解開。也可以只檢查模式,然後調用一個函數。 – azium

回答

1

正如評論所說,你可以切換該函數來調用基於模式:

/* @param {number} mode - 0 for min, 1 (or any non-zero value) for max 
** @returns {number} result of calling Math.min or Math.max on array (may be NaN) 
*/ 
function getMinMax(arr, mode) { 
    return mode? Math.max.apply(Math, arr) : Math.min.apply(Math, arr); 
} 

如果你喜歡更少的代碼:

function getMinMax(arr, mode) { 
    return Math[mode? 'max' : 'min'] .apply(Math, arr); 
} 

調用數學方法與這個設置爲數學沒有明確要求的任何地方,它只是似乎是明智和不超過輸入。

+0

我接受了這個答案,因爲它是我最終使用 – nluigi

2

這兩個值都將被計算。我建議你在這裏使用'策略'模式。所以它看起來像:

getArrayMinMax: function (array, strategy) { 
    //you should pass Math.min or Math.max 
    return strategy.apply(null, array) 
}; 

,因此它可能以這種方式被使用:

getArrayMinMax([1, 2, 3, 4], Math.min); 
+0

下面是更詳細的描述http://www.dofactory.com/javascript/strategy-design-pattern – Nodarii

1

偷懶的評價,您可以在功能將它們包裝:

function arrayMinMax(array, mode) { 
    // return min/max value from 1D array 
    return { 
    0: function() { return Math.min.apply(null, array); }, 
    1: function() { return Math.max.apply(null, array); } 
    }[mode](); 
} 
相關問題