2015-03-03 35 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