如何创建键为数值范围的查找对象 规避逐个枚举键的低效实现
实现方案
JavaScript 原生不支持直接将数值范围作为对象键实现自动匹配,你举例的对象字面量写法原生无法识别,但可以通过封装实现你期望的 numbers[数值] 访问效果,无需逐个枚举区间内的所有值。
方案1:Proxy 封装(完全符合你要的访问语法)
通过 Proxy 的 get 拦截器自动处理数值到区间的匹配逻辑,外部调用方式和你预期的完全一致:
// 区间配置,增删改区间只需要维护这个数组即可 const rangeConfig = [ { min: 500, max: 524, value: "20" }, { min: 600, max: 650, value: "25" } ] const numbers = new Proxy({}, { get(target, prop) { const point = Number(prop) if (isNaN(point)) return undefined // 匹配所在区间 const matchedRange = rangeConfig.find(range => point >= range.min && point <= range.max) return matchedRange ? matchedRange.value : undefined } })
使用方式和你要求的完全相同:
user.list.map(list => numbers[user.points])
方案2:函数封装(兼容性更好,无Proxy依赖)
如果不需要保持对象访问的写法,可以直接封装为匹配函数,逻辑和上述方案一致:
const getPointRangeValue = (point) => { const rangeConfig = [ { min: 500, max: 524, value: "20" }, { min: 600, max: 650, value: "25" } ] const matchedRange = rangeConfig.find(range => point >= range.min && point <= range.max) return matchedRange ? matchedRange.value : undefined } // 调用方式 user.list.map(list => getPointRangeValue(user.points))
性能优化提示
如果区间数量非常多,可以先把rangeConfig按min字段排序,用二分查找替代find遍历,匹配时间复杂度可以从O(n)降低到O(logn),普通业务场景下直接用find已经足够满足性能需求。
内容的提问来源于stack exchange,提问作者gari30voos
相关产品推荐
相关产品推荐

