JavaScript如何按未知键的值排序对象数组,返回前3高值及并列对应的键
单键值对象数组排序取前3(含并列)实现方案
原代码问题说明
你原有代码的问题在于直接对数组类型的obj调用Object.entries,得到的是「数组索引: 对应位置对象」的键值对,而非你需要的每个单键对象内部的键值,所以排序逻辑完全不生效。
实现思路
- 先遍历原数组,把每个单键对象拆解为
[键名, 数值]的二维数组项 - 对二维数组按数值做降序排序
- 提取排序后的所有数值,去重后取前3位的最小值作为「第三档分数线」
- 筛选所有数值大于等于该分数线的项,提取对应键名即为结果
完整实现代码
function getTop3(arr) { // 拆解每个单键对象为[键, 值]格式 const list = arr.map(item => { const [key, val] = Object.entries(item)[0] return [key, val] }) // 按值降序排序 list.sort((a, b) => b[1] - a[1]) // 计算第三档分数线,兼容总分数不足3种的场景 const uniqueScores = [...new Set(list.map(i => i[1]))] const threshold = uniqueScores.length >= 3 ? uniqueScores[2] : uniqueScores.at(-1) // 筛选符合条件的键名返回 return list.filter(i => i[1] >= threshold).map(i => i[0]) }
效果验证
测试示例1
const arr1 = [ {'tom':4}, {'bill':5}, {'tina':6}, {'tim': 3} ] console.log(getTop3(arr1)) // 输出:['tina', 'bill', 'tom']
测试示例2
const arr2 = [ {'tom':4}, {'bill':5}, {'tina':6}, {'tim': 3}, {'jim':4} ] console.log(getTop3(arr2)) // 输出:['tina', 'bill', 'tom', 'jim']
内容的提问来源于stack exchange,提问作者Jenny
相关产品推荐
相关产品推荐

