比较对象里面字段的数字大小,取得最高的4个

就是说我有一个数组,数组里面有N个对象,对象里面有个字段count是0,每次我点击一个对象,里面的count就+1, 我会取count数字最高的4个存入新数组里面,然后进行从大到小排序,这个怎么弄呢
[
{count:0,name:'1'},
{count:0,name:'2'},
{count:0,name:'3'},
{count:0,name:'4'},
...
]

阅读 3.3k
5 个回答

数组根据count属性值大小排序,取前四个不就好了,这js最基础的东西啊,好好学吧,少年

/**
 * 每次点击之后就调用这个函数进行更新
 * @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

可以先sort根据count倒序排列,然后slice取出你想要的N个最大的,最后map将这N个对象数组中的count转成一维数组。

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)

个数不多,这里用优先队列思路

没记错的话,用堆排序比较稳定。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题