我可以帮助理解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
答案 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个参数,max
和cell
。现在将这些值视为previous
和current
值
第6行:使用Math.max
将先前的{max
参数)值与当前(cell
参数)值进行比较。返回两者中的较高者。
第7行:Array.prototype.reduce
的第二个参数设置为0
。这意味着在第一次迭代时,max
的初始值为0
。
基本上,这样做是循环遍历row
数组中的每个rows
子数组。在每次迭代时,它将上一次迭代max
返回的值与当前值进行比较。如果当前值大于前一个值,则返回新的max
。 max
最初设置为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()
。
答案 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)。现在,以下每个语句都变得越来越复杂,但与第一个完全相同。