如何从整数数组中获取前5个最大元素,而这些元素又是js对象的属性。 谢谢你的帮助。
答案 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 值,请在切片前使用filter
和indexOf
来选择重复的值:
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
。