兄弟,你会画地图吗?— MapReduce 去神秘化
兄弟,你会画地图吗?— MapReduce 去神秘化
原文:https://medium.com/hackernoon/bro-do-you-even-map-mapreduce-demystified-ea7f11b0e238

我见过很多人在努力理解 map/reduce 函数。他们要么认为这太复杂,难以理解,要么认为这是他们不会需要的“大数据东西”。
猜猜看,我强烈不同意。
如果你想知道什么是 map/reduce,或者想说服你的老板在现实生活中使用 map/reduce 是一个很棒的风格指南提示,你可以阅读这篇文章
或者只是为了好玩。因为编程很好玩。我们都知道。
我们来玩一个“这段代码是做什么的”的游戏。
为了玩这个很棒的游戏,让我们假设你是编程新手。你没有 10 年阅读奇怪的命令式代码的经验。你被要求阅读一段代码,以便理解它做什么。
- 命令式风格(难度:比应该的要难):
解决方案:也许你甚至没有意识到这一点,但是你必须想象你是一台电脑,并且按照程序运行,直到你在头脑中计算出你所期望的结果。如果你更好的话,你可能会发现这段代码是用来对输入数组中奇数的平方数求和的。
这真的很简单吗?
- 功能型(难度:容易。除非你太习惯命令式风格。你应该改变这一点。说真的。):
这段代码做了同样的事情。但不是阅读如何得到结果,而是强调结果应该是什么。它实际上几乎是在说:
- 从我们的
numbers输入开始 - 选择奇数
- 计算它们所有的平方
- 对结果求和
如果有人问你,你会如何描述这个算法。什么是奇数,什么是正方形的细节也是可用的,但你不必通读它来获得大的图片。
想再举个例子吗?推荐算法怎么样。这是复杂的东西。不是简单的数字相加。为了更好的可读性,我们将使用类型脚本:
我个人认为这是一些非常可读的代码。前 6 行应该足够让你明白这里发生了什么。
如果你还不够确信,试着想象用forEach循环做同样的事情。
2.这是什么魔法?
如果您完全不熟悉映射/归约/过滤操作符,这里有一个非常简单的描述,说明它们的用途:
- map 将简单地对一个数组的所有元素应用一个函数。所以基本上,
[x, y, z].map(f)将返回一个包含[f(x), f(y), f(z)].的新数组。注意,你和编译器都知道输出的大小与输入的大小相同。同样,如果f返回一个数字,那么保证获得一个数字数组。像 typescript 这样的智能语言可以利用这一点,任何阅读您的代码的人也一样 - filter 将简单地选择你的数组中的一些元素,根据提供的函数对它们进行测试。数字数组仍将返回数字数组,但它的大小可能已经改变。请注意,在整个过程中,您的原始阵列保持不变。
- reduce 会“碾压”一个数组返回一些值。与 map 不同,
reduce函数将把数组作为一个整体,并在其上计算一些东西。在我们的场景中,我们将每个值相加,直到得到元素数组的总和。典型的例子是总和、平均值或对象构造的计算。例如:
Soo…没有更多的 *forEach* ?
嗯,我认为如果你想迭代对象,而每次都不返回任何东西,那么 forEach 是可以的。
myArray.forEach(console.log)我觉得不错。使用map只会返回一个空数组。我们显然忽略了这里的结果,所以没关系。
但是,myArray.forEach(someFunctionThatReturnsSomething)很可能是错的。大多数时候你想对结果做点什么。
结论
恭喜你,地图/缩小对你来说不再是一个谜了。

或许是吧?自由提问或发表一些评论!



