Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何简化多个嵌套if-else语句的代码_Javascript_If Statement_Coffeescript - Fatal编程技术网

Javascript 如何简化多个嵌套if-else语句的代码

Javascript 如何简化多个嵌套if-else语句的代码,javascript,if-statement,coffeescript,Javascript,If Statement,Coffeescript,我目前正在使用以下代码进行比较,但正如您所看到的,我正在生成大量if-else语句。有没有办法简化代码并提高效率 getGenderRef: (grammer=nil) -> @gender_ref = "" gender = this.get('gender') if gender? and gender == 'male' if grammer == 'he' @gender_ref = 'he' else if grammer == 'his'

我目前正在使用以下代码进行比较,但正如您所看到的,我正在生成大量if-else语句。有没有办法简化代码并提高效率

getGenderRef: (grammer=nil) ->
  @gender_ref = ""
  gender = this.get('gender')
  if gender? and gender == 'male'
    if grammer == 'he'
      @gender_ref = 'he'
    else if grammer == 'his'
      @gender_ref == 'his'
    else if grammer == 'him'
      @gender_ref == 'him'
  else if gender? and gender == 'female'
    if grammer == 'he'
      @gender_ref = 'she'
    else if grammer == 'his'
      @gender_ref == 'her'
    else if grammer == 'him'
      @gender_ref == 'her'
  else if gender? or gender == null
    if grammer == 'he'
      @gender_ref = 'he/she'
    else if grammer == 'his'
      @gender_ref == 'his/her'
    else if grammer == 'him'
      @gender_ref == 'him/her'

考虑使用switch语句

switch (gender) {
  case "1":
    alert("");
    break;
  case "2":
    alert("");
    break;
  case "3":
    alert("");
    break;
  case "4":
    alert("");
    break;
  default:
    alert("default");
    break;
}
你可以用一张地图

var rules = {
    'female': {
        'he': 'she',
        'his': 'her',
        // ...
    },
    'male': {
        'he': 'he',
        // ...
    },
    'default': {
        'he': 'he/she'
        // ...
    }
};

this.gender_ref = rules[gender ? gender : 'default'][grammer];
它是可扩展的,也可以从另一个后端(例如数据库)动态生成

在coffeescript中编辑(由Linus G Thiel编写):

rules =
  female:
    he: 'she'
    his: 'her'
    // ...
  male:
    he: 'he'
    // ...
  default:
    he: 'he/she'
    // ...

@gender_ref = rules[gender or 'default'][grammer]

您可以按如下方式稍微减少长度:

getGenderRef: (grammer=nil) ->
  @gender_ref = ""
  gender = this.get('gender')
  if gender? and gender == 'male'
    if grammer == 'he'
      @gender_ref = 'he'
    else if grammer == 'his'
      @gender_ref == 'his'
    else if grammer == 'him'
      @gender_ref == 'him'
  else if gender? and gender == 'female'
    if grammer == 'he'
      @gender_ref = 'she'
    else if grammer == 'his' or grammer == 'him'
      @gender_ref == 'her'
  else if gender? or gender == null
    if grammer == 'he'
      @gender_ref = 'he/she'
    else if grammer == 'his'
      @gender_ref == 'his/her'
    else if grammer == 'him'
      @gender_ref == 'him/her'
你不能把它缩短很多,因为你有很多不同的输出选项。 一个swtich/case可能是一个选项,但这将是同样多的代码

另一种选择是使用对象:

references = {
    'male': {
        'he': 'he',
        'his': 'his',
        'him': 'him'
    },
    'female': {
        'he': 'she',
        'his': 'her',
        'him': 'her'
    },
    'null':{
        'he': 'he/she',
        'his': 'his/her',
        'him': 'him/her'
    }
}
//Access:
gender_ref = references[gender ? gender : 'null'][gender_ref];

使用多维哈希表

grammarByGender = {
    "male": { "he" : "he", "his": "his", "him": "him" },
    "female": {"he" : "she", "his" :"her", "him":"her"},
    "neuter": {"he":"he/she","his":"his/her","him":"him/her"}
}

@gender_ref = grammarByGender[this.get("gender")][grammer]

使用映射缓存可能的值。您可以在任何时候扩展它,并可以简化您的方法:

var genders = {
    "male" : {
       "he": "he",
       "his": "his",
       "him": "him"
   },
   "female" : {
       "he": "she",
       "his": "her",
       "him": "her" 
   },
   "null": {
      "he": "he/she",
      "his": "his/her",
      "him": "him/her"
   }
}

function getGenderRef (grammer) {
  var gender_ref = "",
      availableGenders = genders[this.get('gender')];

  if (availableGenders) {
      gender_ref = availableGenders[grammer];
  }
}

就性能而言,if语句没有什么错。我忍不住想知道这是否不仅仅是为了可读性

无论如何,这里还有另一个仍然使用if语句的选项

@gender_ref = grammer; // male values are the same so use as default

if(  gender == "female" ) {

    if( grammer == 'he' ) @gender_ref = 'she';
    if( grammer == 'his' ) @gender_ref = 'her';
    if( grammer == 'him' ) @gender_ref = 'her';

} else if (  !gender ) { // if not defined

    if( grammer == 'he' ) @gender_ref = 'he/she';
    if( grammer == 'his' ) @gender_ref = 'his/her';
    if( grammer == 'him' ) @gender_ref = 'him/her';
}

如果你一步一步走,那就容易了。您将学习如何以这种方式重构复杂条件

首先,请注意,在第一个
if
及其后续的
else if
s中有一个公共检查,即
if-gender?
。您应该将其作为常规检查,并按照以下方式重构代码:

  if gender?
    ...
  else # if gender == null
    ...
这构成了主if和else子句。您将在这些下嵌套if和switch语句。重构的if/else代码如下所示:

  if gender?
    if gender == 'male'
      switch grammer
        when 'he' then @gender_ref = 'he'
        when 'his' then @gender_ref = 'his'
        when 'him' then @gender_ref = 'him'
    else if gender == 'female'
      switch grammer
        when 'he' then @gender_ref = 'she'
        when 'his' then @gender_ref = 'her'
        when 'him' then @gender_ref = 'her'
  else # if gender == null
    switch grammer
      when 'he' then @gender_ref = 'he/she'
      when 'his' then @gender_ref = 'his/her'
      when 'him' then @gender_ref = 'him/her'
Coffeescript中的开关可以很好地适应您的情况,使代码可读性更好,复杂性更低。您可以进一步优化它


下面是一个简单的优化,您在
switch
语句的开头对
@gender\u ref
进行赋值(同样,去掉公共部分):


通过将
@gender\u ref=
赋值移动到父项if,您可以对其进行进一步优化(尽管else子句中不起作用……我想知道为什么)。

这不是Felix刚才建议的吗?顺便说一句,默认值不再有效,因为您将密钥名更改为null。我猜,但我只是在发布后才看到。我们不能使用
'null'
字符串作为键吗?你的映射看起来与Felix的版本惊人地相同,相同的引号,相同的顺序,相同的变量名…@Christoph可能是因为我使用了问题中指定的变量和顺序。我曾经有过这样的情况,两个答案有相同的代码,只是因为这是应该做的。另外,我总是使用单引号:php。通过将
else if
替换为
if
您正在更改代码的行为…嵌套的
if
也缺少了…;)虽然行为不同,但输出是相同的。这是正确的,但这是危险的,因为您无法确保没有任何情况下输出事实会因不同的行为而不同。因此,一个人不应该在不告诉OP的情况下修改代码。也许他不会注意到,以后会遇到麻烦——谁知道呢?答案不错。我喜欢使用
“neuter”
:)。它混合了CoffeeScript和JS语法。我建议使用Coffee的无括号对象文字来减少代码的拥挤程度,并在
grammarByGender[…]
访问上添加一个条件,以便在没有性别时使用
“中性”
。这使用了一个小函数来避免一些代码重复:)
  if gender?
    if gender == 'male'
      @gender_ref = switch grammer
        when 'he' then 'he'
        when 'his' then 'his'
        when 'him' then 'him'
    else if gender == 'female'
      @gender_ref = switch grammer
        when 'he' then 'she'
        when 'his' then 'her'
        when 'him' then 'her'
  else # if gender == null
    @gender_ref = switch grammer
      when 'he' then 'he/she'
      when 'his' then 'his/her'
      when 'him' then 'him/her'