如何按自定义等级优先级对JavaScript对象数组进行排序?
实现方案
思路
- 先定义等级的优先级权重,数值越小排序越靠前
- 将原等级映射对象反转,生成「车辆ID-排序权重」的映射表,方便快速查找
- 排序时优先按权重升序排列,权重相同的场景可回退到原position排序(可根据需求调整)
完整实现代码
// 原数据 const cars = [ { id: 'a1c1', position: 3, name: 'Car 3', }, { id: 'b9f6', position: 1, name: 'Car 1', }, { id: '3b6d', position: 2, name: 'Car 2', }, ]; const carsByRank = { good: 'b9f6', best: '3b6d', average: 'a1c1', }; // 1. 定义等级优先级,数值越小越靠前 const rankWeight = { best: 1, good: 2, average: 3 } // 2. 生成ID对应权重的映射表 const idToWeight = Object.fromEntries( Object.entries(carsByRank).map(([rank, id]) => [id, rankWeight[rank]]) ) // 3. 排序实现 const sorted = cars.sort((a, b) => { // 无匹配等级的默认权重设为99,统一排在最后 const weightA = idToWeight[a.id] ?? 99 const weightB = idToWeight[b.id] ?? 99 // 优先按权重排序 if (weightA !== weightB) { return weightA - weightB } // 权重相同场景按原position升序排列,不需要可删除该行 return a.position - b.position })
额外说明
- 数组的
sort方法是原地排序,如果需要保留原数组不变,可以先对原数组做浅拷贝再排序:const sorted = [...cars].sort(...) - 如果需要调整等级顺序或者新增等级,只需要修改
rankWeight对象的配置即可,无需修改排序逻辑 - 无匹配等级的车辆默认权重设为99,统一排在指定等级之后,如果需要调整这些车辆的排序规则,可以修改权重相同后的回退逻辑
内容的提问来源于stack exchange,提问作者TheRoyality
相关产品推荐
相关产品推荐

