codewar上的一道题:
recipe = {flour: 500, sugar: 200, eggs: 1};
available = {flour: 1200, sugar: 1200, eggs: 5, milk: 200}
function cake(recipe,available){}返回最多能做几个蛋糕,如上面的例子可以做2个
最高票答案是杰样的:
function cakes(recipe, available) {
return Object.keys(recipe).reduce(function(val, ingredient) {
return Math.min(Math.floor(available[ingredient] / recipe[ingredient] || 0), val)
}, Infinity)
}
Object.keys(recipe)返回一个数组["flour","sugar","eggs"]
感觉这个相当于for(var key in recipe)啊
Object.keys()
方法会返回一个由给定对象的所有可枚举自身属性的属性名组成的数组,数组中属性名的排列顺序和使用for-in循环遍历该对象时返回的顺序一致 (顺序一致不包括数字属性)(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性)。
reduce函数:
[0,1,2,3,4].reduce( (accumulator, currentValue, currentIndex, array) => {
return accumulator + currentValue;
}, 10); //结果为10+0+1+2+3+4=20
arr.reduce(callback,[initialValue])
,这里initialValue是第一次调用callback时的第一个参数
"val:Infinity///ingredient:flour"
"val:2///ingredient:sugar"
"val:2///ingredient:eggs"
可以看出回调函数后面的那个参数会作为初始值,第一轮迭代,val=Infinity(无限大)。如果不写这个参数,初始值val就是egg,不能进行大小比较。
Math.floor(available[ingredient] / recipe[ingredient] || 0)
如果||左侧是真就等于左侧,假则等于右侧。如果availbale里面某一项是undefined那表达式左侧就是false,就返回0,做不了蛋糕。Math.floor取小于值得最大整数。
Math.min(a,val)比较之前的最小值和当前值大小,最后返回