使用reduce,并对如何预先形成此算法进行排序?

时间:2017-07-10 01:11:23

标签: javascript dom reduce

所以我有问题,我得到了这样的数组数组。

Array = [ [2,5,1], [1,23], [3], [22,16,8] ]

我必须根据数组中的最大值从最小到最大来排序子数组。所以顶部数组变为:

[ [3], [2,5,1], [22,16,8], [1,23] ]

我必须创建两个函数,一个用于查找数组的最大值,另一个用于以下方法。

x.sort(method)会得到上面的答案。

我创建了一个方法来查找数组中的最大值。

function fidMax(array){
  copy = array.sort(function(a,b){return a-b})
  return copy[copy.length-1]
}

它只是对数组进行排序,并返回最后一个元素。

现在我想制作第二种使用reduce的方法。

function compare(array){
  array.reduce(findMax)
}

我有,但它不起作用,它甚至不会编译,我不知道为什么。我必须在findMax()方法中使用compare()方法,而compare()方法必须使用reduce()

关于该怎么做的任何想法?

感谢。

2 个答案:

答案 0 :(得分:2)

排序会改变数组,可能不是你想要做的。我不会为你做整个练习,但我可以帮助你使用reduce找到数组中的最大值。

> const foo = [3, 5, 2];
undefined
> foo.reduce((max, currentValue) => Math.max(max, currentValue))
5

答案 1 :(得分:0)

  

我必须在findMax方法中使用compare方法,而compare方法必须使用reduce

鉴于这些规范,唯一可行的解​​决方案效率极低,因为它不会在排序之前预先计算每个子数组的max,但无论如何,这里是:

function compare(a, b) {
  return a.reduce(findMax, 0) - b.reduce(findMax, 0)
}

function findMax(max, curr) {
  return Math.max(max, curr)
}

var x = [ [2,5,1], [1,23], [3], [22,16,8] ]

x.sort(compare)

console.log(JSON.stringify(x))

现在,这只适用于所有子数组都包含非负整数的情况。如果您还必须使用负整数排序,建议您使用0替换每个.reduce()来电的第二个参数中的-Infinity