ChrisGuru ChrisGuru - 3 months ago 22
Javascript Question

I am trying to convert a dynamic formula in Javascript

this is not a regular JS tasks as I need help with JS and maths little bit. I got the math formula done but now I'm trying to get it in javascript.

I writing a calculator so I got var a,b,c and D.

D is the sum of A,B,C (Currently it is 825)

I changed the D from 825 to 600 so everything should reduce propotionaly but not B. B should stay as it is and A and C should reduce.

The following code below calculate correctly but I want to make it dynamic fully. Var newA and newC I can't seem to get the right variable in it as I need the newA to dive by 6 and New C to divide by 5/6.

Is there any genius good in math and javascript?
I also attached an image of the math formula if anyone can maybe write a better JS.
enter image description here
The idea is if that I can after add more variables and when I reduce the D it will let me know how much are the elements that can be reduced.

Here is the code:

// 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);


Here is a general function that takes the original array of values (vals), the index of the fixed value (fixedIndex), and the new sum (newSum); and returns a new array with suitably modified values:

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, index) {return index === fixedIndex ? cur : endRemainingSum*(cur/initRemainingSum);})

For example:

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


[ 62.5, 225, 312.5 ]