Формула JavaScript для вычитания последовательных значений, когда предыдущие достигают нуля - PullRequest
0 голосов
/ 19 марта 2019

Я работаю в проприетарном программном обеспечении в своей компании и обнаружил, что могу реализовать код JavaScript для создания определенных действий внутри него.Я пойду прямо к делу ...

Что у меня есть:

Три поля - FieldA, FieldB, and FieldC.

Что я уже делаю:

(FieldA + FieldB + FieldC) = SUM

Как мне нужно повлиять на приведенную выше формулу:

Subtract 75 from FieldC, 
 IF FieldC < 75, 
then when FieldC reaches 0, 
subtract the remainder from FieldB,
 IF FieldB < remainder, 
then when FieldB reaches 0, 
subtract remainder from FieldA.

Пример ввода пользователя:

FieldA = 20
FieldB = 30
FieldC = 40

Вычитание 75 оставило бы меня с

FieldA = 15
FieldB = 0
FieldC = 0

И, к сожалению, я не могу просто вычесть 75 из СУММЫ, поскольку есть более глубокий смысл того, почему я манипулирую этими значениями отдельных полей.

У кого-нибудь есть идея, как я мог бы реализовать это?Даже просто указав мне на функцию, и я сам смогу прочитать ее.

Спасибо за ваше время!

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Полагаю, вы на самом деле не просто вычитаете, потому что, как вы указали, этот алгоритм имеет тот же результат, что и (a - x + b + c).Если бы вы могли обернуть эти переменные в массив, то использование функции map могло бы стать элегантным решением.

Использование переменных немного сложнее.В JS вы можете иметь функции с переменным числом аргументов, но вам не понравится, например, Python возвращает несколько значений, но вы можете использовать деструктурирующее присваивание вместо того, чтобы пытаться заставить его работать с глобальными переменными.Разумеется, назначение деструктуризации не поддерживается в IE.

function substractArray(amount, items){
	return items.map(function(item){
		item = item - amount;
		amount = (-1)*item;
		if(item < 0){
			item = 0;
        }
		if(amount < 0){
			amount = 0;
        }
		return item;
    })
}

function substractVariables(amount,...args){
	var items = Array.prototype.slice.call(arguments,1);
	return substractArray(amount, items)

}

var data = [40,30,20];
console.log("substractArray");
console.log(substractArray(75,data));

var fieldA = 20;
var fieldB = 30;
var fieldC = 40;

var result = substractVariables(75,fieldC, fieldB, fieldA);

console.log("substractVariables");
console.log(result);

console.log("destructuring assignment");
[fieldC, fieldB, fieldA] = result;
console.log(fieldC, fieldB, fieldA);
0 голосов
/ 26 марта 2019

Я новичок, так что это может не иметь смысла.Ниже приведено то, к чему я пришел, и, похоже, отлично работает.Моя команда и я не смогли найти никаких проблем при тестировании.

Я высоко ценю помощь, предлагаемую всеми.Я понял, что могу использовать абсолютное значение в JS, чего я не знал, пока не увидел код Фрэнсиса.

Спасибо всем!

    var Quad
    var Dual
    var FinalValue

    if (FieldC < 75)
    {
    Quad = 75 - FieldC
    Dual = Quad - FieldB
    if (Dual > 0)
    {FinalValue = Dual - FieldA
    if (FinalValue >= 0)
    {0}
    else
    {Math.abs(FinalValue)}
    }
    else
    {FinalValue = 2 * Math.abs(Dual) + FieldA
    FinalValue}


    }

    else
    {(FieldC - 75) * 4 + FieldB * 2 + FieldA}
0 голосов
/ 19 марта 2019

Было бы замечательно иметь некоторые другие сценарии, чтобы проверить это, если они есть.

const fieldA = 20
const fieldB = 30
const fieldC = 40
let subtractor = 75

let fields = [fieldC, fieldB, fieldA]
let fieldTracker = 0

while (subtractor > 0) {
  if (fields[fieldTracker] === 0 && fieldTracker !== fields.length-1) fieldTracker+=1

  subtractor-=1
  fields[fieldTracker]-=1
}

console.log('remaining amount', Math.abs(fields.reduce((prev, current) => prev+current , 0)))
console.log('fields Array', fields)

Ниже приведена логика в Function. Первый аргумент - это subtractor, а затем остальные или аргументы являются целыми числами, против которых нужно вычесть.

const getRemainder = (subtractor = 0, ...fields) => {
  let fieldTracker = 0

  while (subtractor > 0) {
    if (fields[fieldTracker] === 0 && fieldTracker !== fields.length-1) fieldTracker+=1

    subtractor-=1
    fields[fieldTracker]-=1
  }
  
  return Math.abs(fields.reduce((prev, current) => prev+current , 0))
}

const remainder = getRemainder(75, 40, 30, 20)
console.log(remainder)
...