.reduce()函数如何在Javascript中与Math.max()一起使用?

时间:2015-02-12 01:27:47

标签: javascript arrays eloquent

我可以帮助理解reduce函数如何与Math.max()一起使用吗?

function rowHeights(rows){
    return rows.map(function(row){
        return row.reduce(function(max,cell){
            return Math.max(max, cell.minHeight());
        },0);
    });
}

代码来自书中 Eloquent Javascript

5 个答案:

答案 0 :(得分:2)

我将逐行解释这一点:)

 1    function rowHeights(rows) {
 2        
 3        return rows.map(function(row) {
 4            
 5            return row.reduce(function(max,cell) {
 6                return Math.max(max, cell.minHeight());
 7            },0);
 8            
 9        });
10    
11    }
  • 第1行:声明function rowHeights,它接受​​一个参数rows,一个二维数组。

  • 第3行:在rows数组上调用Array.prototype.map,它基本上在rows内的每个数组元素上调用一个函数,并用返回的值替换每个元素函数调用

  • 第5行:在数组rows中的每个子数组(行)上,调用Array.prototype.reduce,它调用每个元素上的函数以将子数组缩减为单个元素。

  • 第5行:请注意,此功能有2个参数,maxcell。现在将这些值视为previouscurrent

  • 第6行:使用Math.max将先前的{max参数)值与当前(cell参数)值进行比较。返回两者中的较高者。

  • 第7行:Array.prototype.reduce的第二个参数设置为0。这意味着在第一次迭代时,max的初始值为0

基本上,这样做是循环遍历row数组中的每个rows子数组。在每次迭代时,它将上一次迭代max返回的值与当前值进行比较。如果当前值大于前一个值,则返回新的maxmax最初设置为0. reduce函数完成后,它会将row子数组替换为最大数字的值。

此功能也可以写成:

function rowHeights(rows) {
    var newRowsArray = [];

    for (var i = 0, tmp = 0; i < rows.length; i++, tmp = 0) {
        for (var j = 0; j < rows[i].length; j++) {
            tmp = Math.max(tmp, rows[i][j]);
        }
        newRowsArray.push(tmp);
    }

    return newRowsArray;
}

答案 1 :(得分:1)

Math.max返回其两个参数中较大的一个。

.reduce将转换应用于集合(数组)中的每个元素并返回一个值。

在这种情况下,两个参数是先前的最大值和单元格的当前值。因此,对于给定的行,迭代单元格(.reduce)并返回最大值cell.minHeight()


Array.prototype.map

Array.prototype.reduce

Math.max

答案 2 :(得分:1)

想象一下,你有一个数字矩阵[[31,10,23],[20,5,1],[12,31,41]]

rows.map(function (row) {})将遍历每个项目,使用回调函数返回的值更新数组值。

示例:在第一次迭代中,我们有[31,10,23]

row.reduce(function (acumulated, current) {})将使用两个参数(上一个返回值数组中的当前项)调用三次,并返回它们之间的最大值。

   Math.max(0,31) = 31 
   Math.max(31,10) = 31 
   Math.max(31,23) = 31 // This is the returned value

结果将是数字31.当它返回到map函数时,它将在主数组中被替换。所以它会是这样的:

   [31,[20,5,1],[12,31,41]]

并且[20,5,1]和[12,31,41]将重复所有内容。所有这些都将在所有交互结束时具有最大值。

   [31,20,41]

答案 3 :(得分:0)

我要简单地解释这个问题。

Math.max(1, 5)返回最大数字,在此示例中为5。

在传递前一个结果时,Reduce基本上通过一个数组。例如:

[1,2,3,4,5].reduce(function (prevNum, currentNum) {
  return {{number to send to the next iteration as prevNum}};
});

因此,如果将两者放在一起,则reduce将遍历数组中的每个数字并返回找到的最大数字。

[1,2,3,4,5].reduce(function (prevNum, currentNum) {
  return Math.max(prevNum, currentNum);
});

Map将遍历一个数组并创建一个新数组,每个索引都是传递函数的返回值。

[1,2,3,4,5].map(function (currentNum) {
  return currentNum + 1;
});
// this would return [2,3,4,5,6] because I added 1 to each number in the array

在本书的示例中,rowHeights函数基本上使用map遍历每一行,并使用reduce返回表中一行单元格的最大高度。这样做的结果基本上是一个最大高度数组,我假设它将用于设置作者所述的每行的最小高度。

答案 4 :(得分:0)

它将每行的最大值作为数组返回。这些是等同的陈述:

Math.max(1,2,36,9)
Math.max.apply(Math,[1,2,36,9])
[1,2,36,9].reduce(function(mx,c) { return Math.max(mx,c); } )

第一句话很容易理解。它返回这4个数字的最大值(即36)。现在,以下每个语句都变得越来越复杂,但与第一个完全相同。