JavaScript - 无法理解Array.Map& Array.reduce

时间:2016-11-08 05:54:52

标签: javascript arrays function

我一直在研究FCC(免费代码阵营)上的问题,该问题需要扫描2D阵列并从每个1D阵列中找到最大元素并将结果放入1D阵列。我在GitHub上遇到这个解决方案无法理解它。

    function largestOfFour(arr) {
      return arr.map(function(group){
        return group.reduce(function(prev, current) {
          return (current > prev) ? current : prev;
        }, 0);
      });
    }
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

输出为[5,27,39,1001]

我的console.log(arr)给了我:4,5,1,3,13,27,18,26,32,35,37,19,1000,1001,857,1

  1. 当作为函数参数传递时,该2D数组如何转换为1D数组?
  2. 我的console.log(组)给了我:4,5,1,3(第一次),13,27,18,26(第二次),32,35,37,39(第三次)和1000 ,1001,857,1(第四次)。

    1. 匿名函数如何将参数组作为2D内的单个1D数组。
    2. 有人可以帮忙。

2 个答案:

答案 0 :(得分:1)

当您使用Array.map时,它将处理数组中的每个元素,例如。

[1, 2, 3, 4].map(function (item) { return item; } ); 

只返回一个带有[1,2,3,4]的 new 数组,但是我们可以将每个值加倍,就像这样。

[1, 2, 3, 4].map(function (item) { return 2 * item; });

返回[2,4,6,8]。

所以在你的例子中你有一个二维数组。 Array.map在第一级工作。因此,在每次迭代中,该组都是

  • 1st - > [4,5,1,3]
  • 第二 - > [13,27,18,26]
  • 3rd - > [32,35,37,39]
  • 4th - > [1000,1001,185,1]

然后将第1到第4个传递给Array.reduce函数。 Reduce只根据传入的数组返回单个值,或者更好地放置

  

reduce()方法对累加器和数组的每个值(从左到右)应用一个函数,将其减少为单个值。   https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

此处的reduce中发生的是存储最大值,它从0开始,并在第一次迭代时与值4进行比较。当4大于0时,它将被存储并成为我们的新最大值。然后它针对5进行测试,并且当5大于4时,它将其存储为新的最大值,依此类推。

完成后,它会为该数组生成一个最大值,并给出一个数字作为结果。所以现在包含数组的映射的第一次迭代更改为Number,在这种情况下,Array.map生成的Array的第一项应为5。

我怀疑的最终输出是

[5, 27, 39, 1001]

答案 1 :(得分:0)

那么array.map()通过改变传递给它的数组的值来返回一个新数组,在这种情况下我们自己返回一个函数(array.reduce)。

    arr.map(function(group))

arr.map采用名为' group'的二维数组。并读取其中的每个值,在本例中为另一个数组。所以在第一轮地图'第一个数组是[4,5,1,3],我们称之为reduce。

    group.reduce(function(prev, current)

第一次'减少'我们有prev = 4和current = 5("它从第二个值"开始),然后在:

    return (current > prev) ? current : prev;

它要求5大于4?如果是这样返回5否则返回4.所以它返回5. 5然后传入' prev'为了下一轮减少'我们有prev = 5(从上次运行)和current = 1.

    return (1 > 5) ? 1 : 5;

它返回5,因为它大于1。

    return (3 > 5) ? 3 : 5;

它返回5,因为它大于3. end.reduce()的结尾,最终的返回值' 5'返回到arr.map(),整个第一个数组[4,5,1,3]被单个值' 5'替换。下一次运行arr.map()从第二个数组开始[13,27,18,26]。

我实际上是在freecodecamp上做了那个问题,而且我没有必要使用map或者reduce。我刚刚阅读了使用" double for loop / array.push /返回数组",尽管" map / reduce"是一个更清洁,可能是一个更好的方式。希望能解释它