我一直在研究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
- 当作为函数参数传递时,如何将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"更简洁,可能是更好的方法。