JavaScript 如何从range数组中获取匹配的区间下限值
错误原因说明
- reduce原实现逻辑是取和lookup差值最小的数值,并非查找区间下限。51和0的差值为51,和100的差值为49,因此会返回100,和需求不符。
- find原实现的问题是未预先对range数组做排序,reverse后的数组为
[898, 450, 0, 300, 250, 200],find会返回第一个满足num <= lookup的元素,自然得到0。
正确实现方案
实现前需要先对range数组做升序去重排序,保证区间从小到大有序,避免乱序导致匹配错误。
方法1:reduce实现
const lookup = 135; const range = [0, 100, 150, 200, 300, 300.2]; // 数组去重后升序排序 const sortedRange = [...new Set(range)].sort((a, b) => a - b); const lowerBound = sortedRange.reduce((prev, curr) => { // 保留小于等于lookup的最大数值 return curr <= lookup ? curr : prev; }, sortedRange[0]); console.log(lowerBound); // 输出100,符合预期
方法2:find实现
const lookup = 201; const range = [200, 250, 300, 0, 450, 898]; // 数组去重后降序排序 const sortedDescRange = [...new Set(range)].sort((a, b) => b - a); // 找第一个小于等于lookup的数值,就是区间下限 const lowerBound = sortedDescRange.find(num => num <= lookup); console.log(lowerBound); // 输出200,符合预期
边界情况说明
如果lookup小于range中所有数值,默认返回range的最小元素;如果lookup大于range中所有数值,默认返回range的最大元素,可根据自身需求调整兜底逻辑。
内容的提问来源于stack exchange,提问作者Amv
相关产品推荐
相关产品推荐

