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



我一直在研究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]]);

OUTPUT IS [5,27,39,1001]

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

  1. 当作为函数参数传递时,如何将2D数组转换为1D数组?

我的console.log(group)给了我:4,5,1,3(第一次),13,27,18,26(第二次),32,35,37,39(第三次)和1000,1001,857,1(第四次)。

  • 匿名函数是如何将参数组作为2D内的单个1D数组的?
  • 有人能帮帮我吗?

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

    [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]。

    在你的例子中,你有一个二维数组。数组。地图工作在第一层。所以在每次迭代中,组都是

    • 1 -> [4,5,1,3]
    • 2 -> [13, 27, 18, 26]
    • 3 -> [32,35,37,39]
    • 4 -> [1000,1001, 857, 1]

    所以第1到第4将被传递到数组中。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作为结果。因此,现在包含数组的map的第一次迭代被更改为Number,在本例中是array生成的array的第一项。5.

    我猜最后的输出应该是

    [5, 27, 39, 1001]
    

    array.map()通过改变传递给它的数组的值返回一个新数组,在本例中我们返回一个函数本身(array.reduce)

        arr.map(function(group))
    

    加勒比海盗。map接受一个名为"group"的2D数组,并读取其中的每个值,在本例中是另一个数组。因此,在第一次运行'map'时,第一个数组是[4,5,1,3],我们对它调用reduce。

        group.reduce(function(prev, current)
    

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

        return (current > prev) ? current : prev;
    

    它问5是否大于4?,如果是,返回5,否则返回4。所以它返回5。5然后被传递到'prev',下一次运行'reduce',我们有prev = 5(从上次运行)和current = 1。

        return (1 > 5) ? 1 : 5;
    

    返回5,因为它大于1。

        return (3 > 5) ? 3 : 5;
    

    返回5,因为它大于3。在group.reduce()结束时,最终返回值'5'被返回给arr.map(),整个第一个数组[4,5,1,3]被单个值'5'取代。arr.map()的下一次运行从第二个数组[13,27,18,26]开始。

    我实际上在freecodecamp上做过这个问题,我不需要使用map或reduce。我只是通过使用"double for loop/array"来阅读。"Push/return the array",虽然"map/reduce"更简洁,可能是更好的方法。

    最新更新