轨道
/
JavaScript
JavaScript
/
练习
/
混合果汁
混合果汁

混合果汁

学习练习

简介

while循环

只要满足某个条件,while循环就能重复执行代码。 它的写法是:先写 while关键字,后面跟一个用圆括号括起来的条件,再跟一个用大括号括起来的代码块,里面是循环的循环体。

while (condition) {
  // code that is executed repeatedly as long as the condition is true
}

JavaScript 也有 do-while循环。 这种循环在执行完循环体之后才检查条件。 当条件取决于循环体中算出的结果时,这很有用。

do {
  // The code here will always be executed once and then
  // repeatedly while the condition is true.
} while (condition);

在循环体内部,你可以用 break关键字完全终止循环的执行。 与之相对,continue关键字只终止当前这一次迭代,然后继续下一次迭代。 借助 continue,你常常可以避免把循环体的大部分内容都包进一个 if语句里。

let i = 0;

while (i < 100) {
  i = i + 2;

  if (i % 3 === 0) {
    continue;
  }

  // The code here will only be executed when i was not divisible
  // by 3 in the check above.
}

switch语句

除了 if语句,JavaScript 还有 switch语句,用来按条件执行不同的逻辑。 当需要把一个变量与多个可能值做比较时,就用它。 比较时检查的是严格相等(===),参见比较。 对于某个变量 x,JavaScript 中 switch语句的语法如下。

switch (x) {
  case option1:
    // code that is executed when "x === option1" is true
    break;
  case option2:
    // code that is executed when "x === option2" is true
    break;
  default:
    // code that is executed when x does not equal any of the options
}

default分支是可选的,用来在其他选项都与变量不匹配时执行一些代码。

上面这些 break语句是必需的,因为在 JavaScript 中所有分支默认都会“贯穿”。 也就是说,如果没有 break语句,第一个匹配选项下面所有分支里的代码都会被执行,即使 x 并不匹配那些选项。 这种“默认贯穿”的行为是使用 switch时常见的一个坑。 在函数内部,你也可以用 return代替 break,从而避免这个问题。

说明

你的朋友李梅经营着一家果汁吧,售卖各种美味的混合果汁。 你是她店里的常客,也意识到自己可以让朋友的工作轻松一些。 你决定用自己的编程技能来帮李梅分担工作。

1. 判断调制一杯果汁需要多长时间

李梅喜欢提前告诉顾客,他们点的菜单上的果汁需要等多久。 她很难记住具体的数字,因为调制不同果汁所需的时间各不相同。 'Pure Strawberry Joy'需要 0.5 分钟,'Energizer'和'Green Garden'各需要 1.5 分钟,'Tropical Island'需要 3 分钟,'All or Nothing'需要 5 分钟。 对于其他所有饮品(例如特价饮品),可以假设调制时间为 2.5 分钟。

为了帮助你的朋友,请编写一个函数timeToMixJuice,它接收菜单上的果汁作为实参,并返回调制这杯饮品所需的分钟数。

timeToMixJuice('Tropical Island');
// => 3

timeToMixJuice('Berries & Lime');
// => 2.5

2. 补充青柠角

李梅的很多作品都会用到青柠角,有的作为配料,有的作为装饰。 所以每天早上开始上班时,她都要确保青柠角的料盒装满,够一整天使用。

实现函数limesToCut,它接收李梅需要切出的青柠角数量,以及一个表示她手头整颗青柠库存的数组。 一颗'small'青柠可以切出 6 个青柠角,一颗'medium'青柠可以切出 8 个,一颗'large'青柠可以切出 10 个。 她总是按照青柠在列表中的顺序来切,从第一项开始。 她会一直切下去,直到切够所需的青柠角数量,或者青柠用完为止。

李梅希望提前知道她需要切几颗青柠。 limesToCut函数应该返回需要切的青柠数量。

limesToCut(25, ['small', 'small', 'large', 'medium', 'small']);
// => 4

3. 结束当班

李梅总是工作到下午 3 点。 然后由她的员工德米特里接替。 李梅下班时,常常还有一些已下单但还没调制的饮品。 这时德米特里会接着调制剩下的果汁。

为了让交接更顺利,请实现函数remainingOrders,它接收李梅当班剩余的分钟数,以及一个数组,里面是已下单但还没调制的果汁。 该函数应该返回李梅在下班前无法开始调制的订单。

当班剩余时间总是大于 0。 待调制的果汁数组永远不会为空。 此外,订单按照它们在数组中出现的顺序调制。 如果李梅开始调制某杯果汁,她一定会把它做完,即使要多加一会儿班。 如果没有剩下需要德米特里处理的订单,则应该返回一个空数组。

remainingOrders(5, ['Energizer', 'All or Nothing', 'Green Garden']);
// => ['Green Garden']
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
JavaScript Exercism

准备好开始 混合果汁 了吗?

注册 Exercism,借助 37 个概念159 个练习 和真人导师指导,学习并掌握 JavaScript,全部免费。