我试图在Javascript中转换动态公式

时间:2016-08-30 20:36:04

标签: javascript math

这不是常规的JS任务,因为我需要JS和数学方面的帮助。我完成了数学公式,但现在我试图在javascript中使用它。

我写了一个计算器,所以我得到了var a,b,c和D.

D是A,B,C的总和(目前为825)

我将D从825改为600,所以一切都应该减少propotionaly而不是B. B应该保持不变,A和C应该减少。

下面的代码计算正确,但我想让它完全动态。 Var newA和newC我似乎无法在其中获得正确的变量,因为我需要newA潜水6和New C除以5/6。

数学和javascript有天赋吗? 如果有人可以写一个更好的JS,我还附上了数学公式的图像。 enter image description here 我的想法是,如果我可以添加更多变量,当我减少D时,它会让我知道可以减少多少元素。

以下是代码:

// Variables
var a = 100; 
var b = 225; // this variable does not change.
var c = 500;

// Container sum
var containerSum = a + b + c ;

// New container sum
var newContainerSum = 600;

//  825 - (100 + 500) = 225
var fixedElement = b;

// 600 - 225 = 375
var remainingElementsTotal = newContainerSum - fixedElement;

//Propotion calculate 100/500 = 1/5 = 0.2
var propotions = a/c;
var remainingPropotions = 1 - propotions;


var newA = remainingElementsTotal/6;  
var newC = remainingElementsTotal * (5/6);

2 个答案:

答案 0 :(得分:1)

这是一个通用函数,它采用原始值数组(vals),固定值(fixedIndex)的索引和新求和(newSum);并返回一个具有适当修改值的新数组:

function calc(vals, fixedIndex, newSum) {
  var initSum = vals.reduce(function (prev, cur) {return prev + cur;}, 0);
  var fixedElement = vals[fixedIndex];
  var initRemainingSum = initSum - fixedElement;
  var endRemainingSum = newSum - fixedElement;
  return vals.map(function(cur, index) {return index === fixedIndex ? cur : endRemainingSum*(cur/initRemainingSum);})
}

例如:

calc([100, 225, 500], 1, 600)

返回:

[ 62.5, 225, 312.5 ]

[EDITED]

要在评论中回答您的后续问题,如果您想指定一组固定索引(fixedIndices),这应该有效:

function calc2(vals, fixedIndices, newSum) {
  var initSum = vals.reduce(function (prev, cur) {return prev + cur;}, 0);
  var fixedSum = fixedIndices.reduce(function (prev, cur, index) {return prev + vals[cur];}, 0);
  var initRemainingSum = initSum - fixedSum;
  var endRemainingSum = newSum - fixedSum;
  return vals.map(function(cur, index) {return fixedIndices.indexOf(index) === -1 ? endRemainingSum*(cur/initRemainingSum) : cur;})
}

例如:

calc2([100, 225, 500], [1,2], 600)

返回:

[ -125, 225, 500 ]

答案 1 :(得分:0)

我相信这就是你所寻找的。

var elements = [100, 300, 225, 560, 900],newElements=[];
var containerSum = elements.reduce(function(prev, cur) {
    return prev + cur;
});
var newContainerSum = 1500;
var indexToBeFixed = 1;
var remainingElementsTotal = newContainerSum - elements[indexToBeFixed];
for (var i = 0; i < elements.length; i++) {
  newElements.push(i !== indexToBeFixed?(elements[i] * remainingElementsTotal) / (containerSum - elements[indexToBeFixed]):elements[i] );
}

console.log(newElements);

/*
[ 67.22689075630252,
  300,
  151.26050420168067,
  376.47058823529414,
  605.0420168067227 ]
*/
  

<强>更新

     

元素数组将被修改。