JS - 从数组中获取前5个最大元素

时间:2016-08-31 16:01:18

标签: javascript arrays

如何从整数数组中获取前5个最大元素,而这些元素又是js对象的属性。 谢谢你的帮助。

5 个答案:

答案 0 :(得分:6)

ES6中的解决方案:

values = [1,65,8,98,689,12,33,2,3,789];
var topValues = values.sort((a,b) => b-a).slice(0,5);
console.log(topValues); // [ 1, 2, 3, 8, 12 ]

存在许多其他人,询问您是否需要更多

答案 1 :(得分:1)

[2,6,8,1,10,11] .sort((a,b)=> b-a).slice(0,5)

[11,10,8,6,2]

答案 2 :(得分:1)

“代码行数”高效代码已在其他答案中提到,这是提高运行时和内存效率的算法:

如果您可以在适当位置修改输入数组:递归地对其进行分区,直到枢轴精确位于第5个位置。这种方法具有线性时间平均复杂度。

另一种方法(不需要修改输入数组):

使用最大堆树,遍历输入数组中的所有元素,在每个步骤中,将元素插入堆树,如果堆中包含5个以上的元素,则从堆中删除最小的元素。该算法的运行时间为N * log(5),因此与输入数组大小相比呈线性

答案 3 :(得分:0)

尽管@Kevin和@Cody的上述方法是正确的,但它也会更改原始数组,这可能会影响您的代码。我建议先复制数组,然后执行排序。由于您的数组仅是整数,因此我们可以对其进行浅表复制。为此,您可以使用传播运算符:

values = [1,65,8,98,689,12,33,2,3,789];
var topValues = [...values].sort((a,b) => b-a).slice(0,5); 
// [...values] will create shallow copy
console.log(topValues); // [789, 689, 98, 65, 33]

答案 4 :(得分:0)

这个问题是模棱两可的,除非人们假设数组没有重复的元素。

// Case 1: unique values
values = [1, 65, 8, 98, 689, 12, 33, 2, 3, 789];
var topValues = [...values].sort((a, b) => b - a).slice(0, 5);

console.log(topValues);
// [789, 689, 98, 65, 33]

// Case 2: non-unique values
values = [1, 65, 65, 8, 98, 689, 12, 33, 2, 3, 789];
var topValues = [...values].sort((a, b) => b - a).slice(0, 5);

console.log(topValues);
// [789, 689, 98, 65, 65]

如果重复,则最高值是多少?如果对数组[1, 65, 65, 8, 98, 689, 12, 33, 2, 3, 789]进行排序并取前5个值,则得到

[789, 689, 98, 65, 65]

要获取前5个 unique 值,请在切片前使用filterindexOf来选择重复的值:

values = [1, 65, 65, 8, 98, 689, 12, 33, 2, 3, 789];
var topValues = 
  [...values].sort((a, b) => b - a)
             .filter((v,i,self) => self.indexOf(v) === i)
             .slice(0, 5);

console.log(topValues);
// [789, 689, 98, 65, 33]

或者,在支持ES6 Set的浏览器上:

values = [1, 65, 65, 8, 98, 689, 12, 33, 2, 3, 789];
var topValues = 
  [...new Set(values)].sort((a, b) => b - a)  
                      .slice(0, 5);

console.log(topValues);
// [789, 689, 98, 65, 33]

the suggestion in this other answer之后,我在阵列的副本上应用了sort