[英]I am trying to convert a dynamic formula in Javascript
这不是常规的JS任务,因为我需要JS和数学方面的帮助。 我完成了数学公式,但现在我正尝试用javascript来获取它。
我写了一个计算器,所以得到了var a,b,c和D。
D是A,B,C之和(当前为825)
我将D从825更改为600,因此所有内容都应按比例减少,但B不能减少。B应该保持原样,而A和C应该减少。
下面的代码可以正确计算,但我想使其完全动态。 Var newA和newC我似乎无法获得正确的变量,因为我需要newA除以6,New C除以5/6。
有什么天才擅长数学和JavaScript吗? 如果有人可以编写更好的JS,我还会附上数学公式的图像。 这个想法是,如果我可以在添加更多变量之后减少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);
这是一个通用函数,它采用原始值数组( 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 ]
[编辑]
要在注释中回答您的后续问题,如果您想指定固定索引数组( 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 ]
我相信这就是您想要的。
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 ]
*/
更新资料
elements数组将被修改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.