2015-03-03 34 views
0

我有一個動態大小的陣列,其看起來像這樣:使用Javascript:乘以動態地定尺寸數組值同時

var myArray = [0.10,0.12,0.08,0.08]; 

陣列可以具有更多或更少的值比上面。

這裏的目的是將其插入以下公式:

var iFormula = 1 - ((1 - value1)*(1 - value2)*(1 - value3)* ... (1 - valuen)) 

我試圖for循環如下:

for(var i = 0; i < myArray .length; i++) { 

    iResult = iResult * (1 - myArray[i]) 
}; 

然後減去iResult從1,但你可以想像,做以上for循環與計算iFormula不同。例如,使用數組在我的問題上,如果我兩個0.08值結合在一起,使下面的數組:

var myArray = [0.10,0.12,0.16]; 

下列兩個方程式使用相同的有效數字,但產生兩種不同的結果:

var iResult_1 = 1 - ((1 - 0.10)*(1 - 0.12)*(1 - 0.08)*(1 - 0.08)); // 0.3297 
var iResult_2 = 1 - ((1 - 0.10)*(1 - 0.12)*(1 - 0.16));   // 0.3347 

由於數組是動態調整大小的,我不知道當它到達我的代碼的某個部分時,數組中有多少個值。因此,我不能硬編碼的公式是這樣的:

var iFormula = 1 - ((1 - myArray[0])*(1 - myArray[1])*(1 - myArray[2]) 

任何想法,我可以構造這個?有沒有更好的方法來做這種事情?

+0

不,我不能」不要想象。 for循環應該完美工作。在循環之前是否將'iResult'初始化爲'1'? – Barmar 2015-03-03 10:00:11

+0

你忘記了高中代數嗎? '(1-x)*(1-x)'不等於'(1 - 2x)'。它等於'(1 - 2x + x^2)' – Barmar 2015-03-04 15:28:09

回答

0

您根據for循環算法確定。

我只是想知道你如何期待iResult_1iResult_2是相等的。這裏是我的荒謬論證:

(1 - 1) !== (1 - 0.5) * (1 - 0.5) 
// 0 !== 0.25 

關於做一個更好的方式這種計算方式,這裏是基於Array.prototype.reduce我的建議:

function calculate(arr) { 
 
    return 1 - arr.reduce(function(res, cur) { 
 
      return res * (1 - cur); 
 
     }, 1); 
 
} 
 

 
document.write(calculate([0.10, 0.12, 0.08, 0.08]));

+0

感謝您對reduce函數的回覆和提示,非常方便! – TheDeceived 2015-03-03 23:30:24

0

試試這個

iResult =1; 
for(var i = 0; i < myArray .length; i++) { 

    iResult = iResult * (1 - myArray[i]) 
}; 
iResult = 1 - iResult ; 
+0

請爲您的答案添加一些解釋。 – 2015-03-03 10:38:29

+0

他只需要初始化循環的值! – krachleur 2015-03-03 10:56:25

0

您需要myArray[i]訪問數組元素。並確保在循環之前正確初始化iResult

var myArray = [0.10,0.12,0.08,0.08]; 
 
var value1 = myArray[0], 
 
    value2 = myArray[1], 
 
    value3 = myArray[2], 
 
    value4 = myArray[3]; 
 

 
var iFormula = 1 - ((1 - value1)*(1 - value2)*(1 - value3)* (1 - value4)); 
 
document.getElementById('iFormula').innerHTML = iFormula; 
 

 
var iResult = 1; 
 
for(var i = 0; i < myArray.length; i++) { 
 

 
    iResult = iResult * (1 - myArray[i]) 
 
}; 
 
iResult = 1 - iResult; 
 
document.getElementById('iResult').innerHTML = iResult;
<div>iFormula = <span id="iFormula"></span></div> 
 
<div>iResult = <span id="iResult"></span></div>

+0

感謝您的回覆! – TheDeceived 2015-03-03 23:29:59