Udacity:测验:导航食物链-三元运算符内的三元运算符

时间:2018-12-31 01:46:48

标签: javascript

我目前正在学习有关Javascript的Udacity课程,一年后我重新上了课。我有点想知道答案了,但似乎无法将其反向工程为简单的if语句

方向:

编写一系列三元语句,将变量类别设置为等于

“草食动物”(如果动物吃植物) 如果动物食用动物,则为“食肉动物” 如果动物食用植物和动物,则为“杂食动物” 如果动物不吃植物或动物,则未定义

使用eatsPlantseatsAnimals变量来测试您的代码。

有效答案:

var eatsPlants = false;
var eatsAnimals = true;

var category = (eatsPlants) ? (eatsAnimals) ? "omnivore" : "herbivore" 
: (eatsAnimals) ? "carnivore" : undefined;

console.log(category);

我想了解为什么会出现(eatsPlants)? (eatsAnimals)? 为什么(eatsAnimals)被使用两次?或者简单地说,有人可以帮我解决这个问题吗?我对编码还是很陌生。

我能想到的最好的办法是,但这并不能帮助我理解三元版本:

var eatsPlants = false;
var eatsAnimals = true;

var category;

 if (eatsPlants && eatsAnimals)
 {
    category = "Omnivore"; 

 }  else if (eatsAnimals){
     category="Carnivore"

 } else if (eatsPlants) {
     category = "Herbivore";
 }
 else
 {
     category= undefined;
 }

 console.log(category);

在此先感谢您的帮助

2 个答案:

答案 0 :(得分:0)

这是一段令人困惑的代码。逻辑上缩进,看起来像:

var category = (eatsPlants)
  ? (eatsAnimals ? "omnivore" : "herbivore")
  : (eatsAnimals ? "carnivore" : undefined);

如果eatsPlants为true,则需要根据eatsAnimals条件在“杂食动物”和“草食动物”之间做出决定。否则,如果eatsPlants为假,则需要根据undefined条件在“食肉动物”和eatsAnimals之间做出决定。

因此,来自eatsPlants的每个可能路径都需要检查eatsAnimals条件,以确定要解析为哪个字符串。

if/else版本如下所示:

var category;
if (eatsPlants) {
  if (eatsAnimals) {
    category = 'omnivore';
  } else {
    category = 'herbivore';
  }
} else {
  // eatsPlants is false:
  if (eatsAnimals) {
    category = 'carnivore';
  } else {
    category = undefined;
  }
}

如您所见,通过使用与三元运算符版本相同的逻辑,它还必须检查eatsAnimals两次。

我不建议在这里使用三元运算符-课程的问题是要求您编写看起来非常混乱的代码。这不是一种记忆的技术。我更喜欢使用数组,以便代码阅读器可以看到网格:

const categories = [
  // eatsAnimals is
  //   0            1
  [undefined, 'Carnivore'],   // eatsPlants is 0
  ['Herbivore', 'Omnivore']   // eatsPlants is 1
]

var eatsPlants = 0;
var eatsAnimals = 1;
console.log(categories[eatsPlants][eatsAnimals]);

答案 1 :(得分:0)

首先,不要灰心,继续学习编码。
诸如此类的东西,尤其是其格式化方式,容易使每个人

var category = (eatsPlants) ? (eatsAnimals) ? "omnivore" : "herbivore" 
: (eatsAnimals) ? "carnivore" : undefined;

在查看这种复杂的三元语句组合时,始终牢记三元语句的基本语法

(condition) ? expression if true : expression if false

我将代码重新格式化并添加了注释,以使其更易于阅读:

var category =
    (eatsPlants) ?
    (eatsAnimals) ?   // eatsPlants  === true
    "omnivore" :      // eatsPlants  === true  && eatsAnimals === true
    "herbivore" :     // eatsPlants  === true  && eatsAnimals === false
    (eatsAnimals) ?   // eatsPlants  === false
    "carnivore" :     // eatsAnimals === true
    undefined;        // eatsPlants  === false && eatsAnimals === false

为清楚起见,如果使用单独的if语句重写逻辑,则会得到以下信息:

if (eatsPlants === true && eatsAnimals === true) {
    category = 'omnivore';
}
if (eatsPlants === true && eatsAnimals === false)
    category = 'herbivore';
}
if (eatsPlants === false && eatsAnimals === true)
    category = 'carnivore';
}
if (eatsPlants === false && eatsAnimals === false)
    category = 'undefined';
}