【问题标题】:Using reduce() within map() on array of arrays在数组数组的 map() 中使用 reduce()
【发布时间】:2016-03-12 11:49:30
【问题描述】:

我正在处理一个 freecodecamp 挑战,我想知道为什么我的代码不起作用以及如何更正它。

目标是“返回一个由每个提供的子数组中的最大数组成的数组。”

我的尝试是使用 reduce 作为映射函数来映射输入数组:

function largestOfFour(arr) {
    arr = arr.map(function(innerArray){
       innerArray = innerArray.reduce(function(previousValue,currentValue){
           return currentValue > previousValue ? currentValue : previousValue;
       });
    });
    return arr;
}

console.log(largestOfFour([[4, 5, 1, 3],[1, 2, 3, 4]]));

当前输出为:[undefined, undefined]

我应该如何修复我的代码?

【问题讨论】:

  • 您分配给innerArray,但没有返回任何内容。

标签: javascript


【解决方案1】:

在map回调中,你应该返回reduce的结果:

function largestOfFour(arr) {
  return arr.map(function(innerArray){
    return innerArray.reduce(function(previousValue,currentValue){
      return currentValue > previousValue ? currentValue : previousValue;
    });
  });
}

注意有shorter ways of doing that。

【讨论】:

  • 太好了,谢谢!这真的很清楚数组函数是如何工作的。
  • 选择这个是正确的,因为它回答了我的具体问题,即使我原来的方法不是最好的方法。
【解决方案2】:

有一个更简单的方法

function largestOfFour(arr) {
    return arr.map(function(innerArray) {
      return Math.max.apply(null, innerArray);
    });
}

Math.max 可以使用多个参数调用,如Math.max(3,4,5,6) 将返回6。

使用apply,我们可以将一组参数传递给函数,就像.apply(thisValue, [3,4,5,6]) 一样,并做同样的事情。

既然有一个数组数组,我们可以映射外部数组,并返回Math.max.apply(thisValue, innerArray)的结果,由于thisValue在这里不重要,只传递null就可以了。

【讨论】:

  • 谢谢,我在使用 Math.max 和 map() 时遇到了困难,所以我选择了 reduce() 路线。这为未来扫清了障碍。
【解决方案3】:

解决这个问题的另一种方法

function largestOfFour(arr) {
  return arr.map(function(innerArray) {
    // sort innerArray ascending
    return innerArray.sort(function sort(a, b) {
      return a > b;
    }).pop(); // << get the last element (the max)
  });
}

var result = largestOfFour([
  [4, 5, 1, 3],
  [1, 2, 3, 4]
]);
console.log(result);
document.write(result);

【讨论】:

    猜你喜欢
    • 2021-07-08
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2019-07-18
    • 2013-12-03
    • 2021-12-02
    • 2019-02-27
    相关资源
    最近更新 更多