就是说我有一个数组,数组里面有N个对象,对象里面有个字段count是0,每次我点击一个对象,里面的count就+1, 我会取count数字最高的4个存入新数组里面,然后进行从大到小排序,这个怎么弄呢
[
{count:0,name:'1'},
{count:0,name:'2'},
{count:0,name:'3'},
{count:0,name:'4'},
...
]
就是说我有一个数组,数组里面有N个对象,对象里面有个字段count是0,每次我点击一个对象,里面的count就+1, 我会取count数字最高的4个存入新数组里面,然后进行从大到小排序,这个怎么弄呢
[
{count:0,name:'1'},
{count:0,name:'2'},
{count:0,name:'3'},
{count:0,name:'4'},
...
]
/**
* 每次点击之后就调用这个函数进行更新
* @param num
*/
const getTopFourCount = (num: IProps[]):number[] => {
// res的顺序从大到小
let res:number[] = [];
num.forEach((item, index) => {
// 目标是top4,所以最少4个才排序
if(res.length >= 4 && item.count > res[3]) {
res.pop();
}
if(res.length < 4) {
res.push(item.count);
res = res.sort((a, b) => b - a);
}
})
return res;
}
https://codesandbox.io/s/aged...:260-647
var data = Array(10).fill(0).map((_,i) => ({count: 0, name: i+1}));
var maxs = []; // 存储前4个最大值,按从大到小排序
var indexes = []; // 存储最大值对应的源数据中的索引
function incCount(data, index) {
update(++data[index].count, index);
}
function update(count, index) {
const i = indexes.indexOf(index);
if(i==-1) {
if(maxs.length<4) {
maxs.push(count);
indexes.push(index);
} else {
sort(maxs.length-1, count, index)
}
} else {
sort(i, count, index)
}
}
function sort(i, count, index) {
while(i>=0) {
if(i == 0 || maxs[i-1] >= count) {
maxs[i] = count;
indexes[i] = index;
break;
}
maxs[i] = maxs[i-1];
indexes[i] = indexes[i-1];
i--;
}
}
// inc
incCount(data, 0)
incCount(data, 0)
incCount(data, 0)
incCount(data, 1)
incCount(data, 2)
incCount(data, 3)
incCount(data, 3)
个数不多,这里用优先队列思路
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答4.9k 阅读✓ 已解决
2 回答4.8k 阅读✓ 已解决
4 回答4.4k 阅读✓ 已解决
数组根据count属性值大小排序,取前四个不就好了,这js最基础的东西啊,好好学吧,少年