2012-02-24 41 views
0

我得到存储在一个对象中的多个用户输入,名为inputObj,然后这些属性需要全部排在100以外(附加的是当前排名的一个属性的方法),需要做这为多达20个属性,所以目前这是一种方法,即时通讯重复自己很多。使用if语句的数字操作javascript

该数学是所有工作正常,即时gettign所需的输出,但需要一个更加干净的方式来做到这一点,建议?

的主要问题是,数学运算会为每个属性发生变化,因此适用于所有属性的通用功能不会工作

感谢

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

你可能做的最后一个'if'体的第一行错了吗? – pimvdb 2012-02-24 10:54:50

+0

哦是的,我说好的看出, 答案已经很大!但我忘了解释,数学运算改变每个属性,因此不能让一个功能,并将其应用到不同的属性 – BradStevenson 2012-02-24 12:48:52

+0

@BradStevo:看到更新 – georg 2012-02-24 18:33:54

回答

3

你可以使用一个功能:

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

对待你的对象作为一个数组和遍历它像这样:

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

这是假设的inputObj所有属性都应该同等对待。另请注意,我截断了代码以使示例更简单,更易于阅读。

0

您可以将业务逻辑模型化为类。

类似的东西:

  • 一类操作具有类型(加,减,除...)和值
  • 一类约束它包含操作的列表和值

然后,创建一个约束列表(有一个好的构造函数,你可以在一行代码中实例化一个约束)。循环到这个列表中。对于每个项目,获取约束值,执行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

如何:

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 -object,以及根据最大制约改变max值。 Jerome的代码比Jerome的代码更容易维护,但Jerome的代码更加有效(更快)。

编辑:

我很抱歉,我没有注意到你最后的评论。我已经编辑了一些代码。对于不同的属性,您可以为每个属性创建对象,如ages。然后该函数调用是例如:

getRank(ages,inputObj.dyAGE); 

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