繁体   English   中英

我正在尝试在Javascript中转换动态公式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM