使用if语句javascript进行数字操作

使用if语句javascript进行数字操作,javascript,object,if-statement,Javascript,Object,If Statement,我在一个名为inputObj的对象中存储了多个用户输入,然后这些属性都需要在100个属性中进行排名(附件是当前对一个属性进行排名的方法),最多需要对20个属性进行排名,所以目前这是一个我经常重复自己的方法 数学都很好,我得到了想要的结果,但需要一个更整洁的方法来实现这一点,建议 主要问题是,每个属性的数学运算都会发生变化,因此应用于所有属性的通用函数将无法工作 谢谢 if (inputObj.dyAGE <=5) { inputObj.dyAGE *= 5.5; }

我在一个名为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;
};

if(inputObj.dyAGE将对象视为数组,并像这样迭代:

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

如果(inputObj[i]将对象视为数组,并像这样迭代:

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

如果(inputObj[i]您可以使用一个函数:

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
变成这样

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

您可以使用以下函数:

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
变成这样

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

您可以将业务逻辑建模到类中

诸如此类:

  • 具有类型(加、减、除…)和值的类操作
  • 包含操作列表和值的类约束
然后,创建一个约束列表(使用良好的构造函数,您可以在一行代码中实例化约束)。循环到此列表上。对于每个项目,获取约束值,执行“如果”,然后“如果需要”应用所有操作(在操作类型上切换块)

建模稍微复杂一点,但是如果需要添加很多约束,那么它更易于维护和添加约束

这里是最后一段代码:警告:我还没有测试代码,可能有一些语法错误,但主要原理在这里

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;
  }
}
var myConstraint=new Array();
myConstraint.push(5,{新操作(Operation.TIME,5.5)});
myConstraint.push(7,{新操作(Operation.减号,5),新操作(Operation.TIME,16.5),新操作(Operation.PLUS,33)});
...
对于(变量i=0;iif(inputObj.dyAGE您可以将业务逻辑建模到类中

诸如此类:

  • 具有类型(加、减、除…)和值的类操作
  • 包含操作列表和值的类约束
然后,创建一个约束列表(使用良好的构造函数,您可以在一行代码中实例化约束)。循环到此列表上。对于每个项目,获取约束值,执行“如果”,然后“如果需要”应用所有操作(在操作类型上切换块)

建模稍微复杂一点,但是如果需要添加很多约束,那么它更易于维护和添加约束

这里是最后一段代码:警告:我还没有测试代码,可能有一些语法错误,但主要原理在这里

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;
  }
}
var myConstraint=new Array();
myConstraint.push(5,{新操作(Operation.TIME,5.5)});
myConstraint.push(7,{新操作(Operation.减号,5),新操作(Operation.TIME,16.5),新操作(Operation.PLUS,33)});
...
对于(变量i=0;i
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;
}
此代码可用于
inputObj.dyAGE
中的任何非负整数。如果需要使用浮点值,则在传递到
getRank
-函数时必须将其转换为整数。

如何:

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;
}

此代码可用于
inputObj.dyAGE
中的任何非负整数。如果需要使用浮点值,则在传递到
getRank
-函数时必须将其转换为整数。

最后一个
If
正文的第一行是否可能出错?哦,是的,我没有看到,答案是great!但我忘了解释每个属性的数学运算会发生变化,因此无法生成函数并将其应用于不同的属性。如果
if
body的最后一行,你可能会犯错误吗?哦,是的,我没有看到,答案很好!但我忘了解释数学运算会发生变化为每个属性设置ge,因此无法创建函数并将其应用于不同的属性