首页 > 解决方案 > 为什么在javascript中的reduce函数上添加了Infinitity?

问题描述

在这个特定的代码中,

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.

标签: javascriptfunctional-programming

解决方案


Array.prototype.reduce接受一个归约函数和一个起始值。在数学中,我们通常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,低于 Infinity。

如果您不提供起始值,reduce它将使用数组中的第一个值作为累加器,因此您在第一次迭代时执行此操作:

Math.min(parseInt(available['sugar'] / recipe['sugar'] || 0), 'flour') // => NaN

Math.min不知道如何用flour数字解释它立即变成NaN(不是数字)。进一步的迭代得到这个:

Math.min(5, Nan); // => NaN

NaN如果其中的任何值是 ,则所有 JS 数学函数都将返回NaN。这是一种由 monad 进行的错误处理,您可以在其中让数学不会失败,并且可以在完成时研究结果,这些值超出了界限。下面是一个在 JS中创建NaNInfinity的示例:-Infinity

 0 / 0; // => NaN
 1 / 0; // => Infinity
-1 / 0; // => -Infinity

如果您要找到可以低于零的最大值,那么这-Inifinty是一个非常好的累加器。


推荐阅读