创建一个`batches`函数返回一组元素按照标准符合要求的最大数量

时间:2023-01-02 17:42:14
batches函数接收两个对象作为参数,第一个对象是组成菜谱的食物,第二个对象是可用的配料。每一种配料的值代表有现在多少份原料。
/**
It accepts two objects as arguments: the first object is the recipe
for the food, while the second object is the available ingredients.
Each ingredient's value is number representing how many units there are.

`batches(recipe, available)`
*/

// 0 batches can be made
batches(
  { milk: 100, butter: 50, flour: 5 },
  { milk: 132, butter: 48, flour: 51 }
)
batches(
  { milk: 100, flour: 4, sugar: 10, butter: 5 },
  { milk: 1288, flour: 9, sugar: 95 }
)

// 1 batch can be made
batches(
  { milk: 100, butter: 50, cheese: 10 },
  { milk: 198, butter: 52, cheese: 10 }
)

// 2 batches can be made
batches(
  { milk: 2, sugar: 40, butter: 20 },
  { milk: 5, sugar: 120, butter: 500 }
)

 


#### Answer

必须使菜谱中每一种原料都有足够的数量,数量要超过或者等于单位数量。如果有一种原料没有或者少于一份所需单位量,那么一份都做不成。

使用`Object.keys()`返回菜谱中所需的原料名的数组,然后使用`Array.prototype.map()`循环生成由每一种可用原料和单位原料的比值组成的数组。如果其中有一种原料不存在,那么比值会是NaN,所以这时候使用或操作符使计算结果是0。

使用扩展运算符`...`将所有计算结果传入`Math.min()`中计算出最小值。然后使用`Math.floor()`向下取整就是最终结果。
const batches = (recipe, available) =>
  Math.floor(
    Math.min(...Object.keys(recipe).map(k => available[k] / recipe[k] || 0))
  )