这不是常规的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,我还附上了数学公式的图像。 我的想法是,如果我可以添加更多变量,当我减少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);
答案 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)
我相信这就是你所寻找的。 p>
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 ]
*/
<强>更新强>
元素数组将被修改。