为什么javascript中的reduce函数中添加了无穷大?
在这个特定的代码中为什么javascript中的reduce函数中添加了无穷大?,javascript,functional-programming,Javascript,Functional Programming,在这个特定的代码中 function cakes(recipe, available) { return Object.keys(recipe).reduce(function(val, ingredient) { return Math.min(parseInt(available[ingredient] / recipe[ingredient] || 0), val) },Infinity); } 函数调用示例: cakes({ flour: 500, sugar: 200
function cakes(recipe, available) {
return Object.keys(recipe).reduce(function(val, ingredient) {
return Math.min(parseInt(available[ingredient] / recipe[ingredient] || 0), val)
},Infinity);
}
函数调用示例:
cakes({ flour: 500, sugar: 200, eggs: 1 },{flour: 1000, sugar: 1200, eggs: 5, milk: 200 });
“它返回2”
如果我在代码中删除
Infinity
,它将返回NaN
它是reduce方法的初始值,如果用数字替换,它将是函数中的最大值
功能蛋糕(配方,可用){
返回对象。键(配方)。减少(函数(val,成分){
返回Math.min(parseInt(可用[配料]/配方[配料]| | 0),val)
},10000);
}
采用还原函数和起始值。在数学中,我们在做加法时通常使用0
,例如[]。reduce((v,a)=>v+a,0)/=>0
,而乘法使用1,例如[]。reduce((v,a)=>v*a,1)/=>1
如果我使用不含任何成分的kake调用代码,它将返回初始累加器值:
const ingredients = { sand: 10000 };
const airCake = {};
cakes(airCake, ingredients); // ==> Infinity
因此,你可以做无限多的空气蛋糕。第二次你有一个蛋糕,你没有无限量的原料,你需要超过0,你会得到很多次,你可以做这个蛋糕,小于无限量,这是传递给下一个原料。结果是你所用成分最少的比例与它的用量之比
const sandCake = { sand: 100 };
cakes(sandCake, ingredients); // ==> 100
这返回100,因为你有足够的沙来容纳100,它小于无穷大
如果您不向reduce
提供起始值,它将使用数组中的第一个值作为累加器,因此您将在第一次迭代时执行此操作:
Math.min(parseInt(available['sugar'] / recipe['sugar'] || 0), 'flour') // => NaN
Math.min
不知道如何用数字解释floor
,它会立即变成NaN
(不是数字)。进一步的迭代可以得到:
Math.min(5, Nan); // => NaN
如果JS数学函数中的任何值为NaN
,则所有JS数学函数都将返回NaN
。这是一种由monad进行的错误处理,在这种情况下,您可以让数学不失败,并且可以在完成时研究值超出范围的结果。下面是在JS中创建NaN
、Infinity
和-Infinity
的示例:
0 / 0; // => NaN
1 / 0; // => Infinity
-1 / 0; // => -Infinity
如果要找到某个值的最大值,且该值可以低于零,那么Inifinty是一个非常好的累加器。因此Math.min中的第一个比较成功。第二个参数是reduce的初始值