JavaScript:计算对象数组中各值与最大值的层级距离
解决方案
要实现这个需求,可以分三步完成:提取并处理值、建立值与层级的映射、生成结果数组。
步骤分解
- 提取并处理值:先从原数组中取出所有
value,去重后按从大到小排序。这样排序后的数组索引就是对应的层级距离(最大值在索引0,对应距离0;次大值在索引1,对应距离1,以此类推)。 - 建立映射表:把排序后的每个值和它的索引(层级距离)存到一个对象里,方便后续快速查找。
- 生成结果数组:遍历原数组的每个对象,通过映射表找到对应的层级距离,收集成最终数组。
代码实现
const array = [ { id: 1, value: 20 }, { id: 2, value: 10 }, { id: 3, value: 10 }, { id: 4, value: 3 }, { id: 5, value: 2 }, ]; // 1. 提取所有value,去重后降序排序 const uniqueValues = [...new Set(array.map(item => item.value))].sort((a, b) => b - a); // 2. 创建值到层级距离的映射 const valueToLevel = uniqueValues.reduce((map, value, index) => { map[value] = index; return map; }, {}); // 3. 生成结果数组 const newArray = array.map(item => valueToLevel[item.value]); console.log(newArray); // 输出: [0, 1, 1, 2, 3]
关键细节说明
- 使用
new Set()去重,确保相同值只会对应一个层级距离; - 排序时用
b - a实现降序,保证最大值排在最前面; reduce方法高效构建映射表,后续查找的时间复杂度是O(1),整体算法的时间复杂度主要由排序决定,为O(n log n),适合大多数场景。
内容的提问来源于stack exchange,提问作者Samke11
相关产品推荐
相关产品推荐

