Числовое манипулирование с использованием оператора if javascript - PullRequest
0 голосов
/ 24 февраля 2012

Я получаю несколько пользовательских входных данных, хранящихся в объекте, называемом inputObj, тогда все эти свойства должны быть ранжированы из 100 (прикрепленный является текущим методом для ранжирования одного свойства), необходимо сделать это для 20 свойствТак что в настоящее время это метод, где я повторяюсь много.

Математика все работает хорошо, и я получаю нужные результаты, но нужен более аккуратный способ сделать это, предложения?

Основная проблема заключается в том, что математические манипуляции будут меняться для каждого свойства, поэтому универсальная функция, применяемая ко всем свойствам, не будет работать

Спасибо

if (inputObj.dyAGE <=5) {
    inputObj.dyAGE *= 5.5;  
    }       
else if (inputObj.dyAGE<=7) {
    inputObj.dyAGE -= 5;
    inputObj.dyAGE *= 16.5;
    inputObj.dyAGE += 33;       
    }
else if(inputObj.dyAGE<=11) {
    inputObj.dyAGE -= 7;
    inputObj.dyAGE *= 8.25;
    inputObj.dyAGE += 66;
    }
else if (inputObj.dyAGE<=16) {
    inputObj.dyAGE -= 17;
    inputObj.dyAGE = -inputObj.dyAGE;
    inputObj.dyAGE *= 6.6;
    inputObj.dyAGE += 66;       
    }   
else if(inputObj.dyAGE <= 19) {
    inputObj.dyAGE -= 20;
    inputObj.dyAGE = -inputObj.dyAGE;
    inputObj.dyAGE *= 11;
    inputObj.dyAGE += 33
    }   
else if (inputObj.dyAGE <= 30) {
    inputObj.dyAGE-31;
    inputObj.dyAGE = -inputObj.dyAGE;
    inputObj.dyAGE *= 3;
};

Ответы [ 4 ]

3 голосов
/ 24 февраля 2012

Вы можете использовать функцию:

inputObj.dyAGE = convert_AGE(inputObj.dyAGE)

function convert_AGE(x) {

    if (x <= 5)
        return x * 5.5;  
    if (x <= 7)
        return (x - 5) * 16.5 + 33;
    etc

Также вы можете конвертировать серии присваиваний (inputObj.dyAGE=...) в выражения, чтобы это

inputObj.dyAGE -= 17;
inputObj.dyAGE = -inputObj.dyAGE;
inputObj.dyAGE *= 6.6;
inputObj.dyAGE += 66;      

становится этим

(17 - x) * 6.6 + 66

или даже

178.2 - 6.6 * x

Конечно, вы можете использовать разные функции для каждого свойства, например

      inputObj.dyAGE = convert_AGE(inputObj.dyAGE)
      inputObj.dyXYZ = convert_XYZ(inputObj.dyXYZ)

или автоматизируйте это, создав хэш функций:

   convertors = {
         'dyAGE': function(x) { code to convert age },
         'dyXYZ': function(x) { code to convert xyz },
          etc
    }

, а затем конвертировать все свойства сразу

    for (var prop in input)
        if (prop in convertors)
            input.prop = convertors[prop](input.prop);
0 голосов
/ 24 февраля 2012

Как насчет этого:

var ages={
    min: 0,
    max: 11,
    '0': function (x){return 5.5;},
    '5': function (x){return x*5.5;},
    '7': function (x){return (x-5)*16.5+33;},
    '11': function (x){return (x-7)*8.25+66;}
}

function getRank(oper,prop){
    if(prop<oper.min || prop>oper.max) return false;
    var idx=prop,rank;
    while(!oper.hasOwnProperty(idx)){
        idx++;
        if(idx>oper.max) return false;
    }
    rank=oper[idx](prop);
    return rank;
}

Просто добавьте каждое ограничение и его математическое выражение к ages -объекту, а также измените значение max в соответствии с наибольшим ограничением. Это легче поддерживать, чем код Джерома, хотя Джером и более эффективен (быстрее).

EDIT:

Извините, я не заметил ваш последний комментарий. Я немного отредактировал код. Для разных свойств вы создаете объект типа ages для каждого. Тогда вызов функции, например:

getRank(ages,inputObj.dyAGE);

Этот код можно использовать с любым неотрицательным целым числом в inputObj.dyAGE. Если необходимо использовать значения с плавающей запятой, они должны быть преобразованы в целые числа при передаче в getRank -функцию.

0 голосов
/ 24 февраля 2012

Вы можете смоделировать свою бизнес-логику в класс.

Что-то вроде этого:

  • операция класса, которая имеет тип (плюс, минус, деление ...) изначение
  • класс Constraint, который содержит список операций и значение

Затем создайте список Constraint (с хорошим конструктором вы можете создать экземпляр Constraint в одной строкекод).Цикл в этот список.Для каждого элемента получите значение ограничения, выполните if, затем при необходимости примените все операции (переключите блок на тип операции).

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

Вот последний код: предупреждение: я не проверял код, возможно, есть некоторая синтаксическая ошибка, но основная философия здесь.

var myConstraint = new Array();
myConstraint.push(5, {new Operation(Operation.TIME, 5.5)});
myConstraint.push(7, {new Operation(Operation.MINUS, 5), new Operation(Operation.TIME, 16.5), new Operation(Operation.PLUS, 33)});
...

for (var i = 0; i < myConstraint.length; i++) {
  var c = myConstraint[i];
  if (inputObj.dyAGE <= c.value) {
    var op = c.operations;

    for (var i = 0; i < op.length; i++) {
      switch (op[i].type) {
        case PLUS : inputObj.dyAge += op[i].value; break;
        case ...
      }
    }

    break;
  }
}
0 голосов
/ 24 февраля 2012

Рассматривайте ваш объект как массив и итерируйте его следующим образом:

for(var i in inputObj) {
   if (inputObj[i] <=5) {
      inputObj[i] *= 5.5;  
   }       
   ...
}

Это предполагает, что все свойства inputObj должны обрабатываться одинаково.Также обратите внимание, что я сократил ваш код, чтобы сделать образец проще и легче для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...