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)) )