我一直在研究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]]);
我的console.log(arr)给了我:4,5,1,3,13,27,18,26,32,35,37,19,1000,1001,857,1
我的console.log(组)给了我:4,5,1,3(第一次),13,27,18,26(第二次),32,35,37,39(第三次)和1000 ,1001,857,1(第四次)。
有人可以帮忙。
答案 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在第一级工作。因此,在每次迭代中,该组都是
然后将第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"是一个更清洁,可能是一个更好的方式。希望能解释它