Javascript:同时乘以动态大小的数组值

时间:2015-03-03 09:57:31

标签: javascript arrays

我有一个动态大小的数组,看起来像这样:

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])
};

然后从1减去iResult但是你可以想象,做上面的循环与计算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])

我有什么想法可以构建这个吗?做这种事还有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

试试这个

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

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

答案 1 :(得分:0)

您需要使用myArray[i]访问数组元素。并确保在循环之前正确初始化iResult

&#13;
&#13;
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;
&#13;
<div>iFormula = <span id="iFormula"></span></div>
<div>iResult = <span id="iResult"></span></div>
&#13;
&#13;
&#13;

答案 2 :(得分: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]));