javascript - 将一系列值映射到另一个值

标签 javascript algorithm dictionary range

我正在尝试找到一种将一系列值映射到另一个值的有效方法。例如

1-9 -> 49  
10-24 ->54  
25-49 -> 59  
50-74 -> 50  
75-99 -> 49  
100-150 -> 40  

这里的值不遵循任何规则模式。一个解决方案是使用条件语句(if -else)但是随着值集的增加,语句的数量也会增加,这将很难维护。那么有没有其他优雅有效的方法来实现这一点?

最佳答案

由于范围是连续的,你可以尝试通过起始编号映射它们,然后通过二分搜索找到值:

var map = [
    [1, 49],
    [10, 54],
    [25, 59],
    [50, 50],
    [75, 49],
    [100, 40],
    [151, void 0]
];
function getValueInRange(arr, n, from, to) {
    return (function main(from, to){
        if(from>=to) return void 0;
        var mid = Math.floor((from+to)/2);
        if(arr[mid][0] > n) return main(from, mid);
        if(arr[mid][0] < n && mid > from) return main(mid, to);
        return arr[mid][1];
    })(from===void 0 ? 0 : from, to===void 0 ? arr.length : to);
}
// Use it like this:
getValueInRange(map, value);

关于javascript - 将一系列值映射到另一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22577888/

相关文章:

javascript - 文本区域占位符消息

javascript - 使用 Mapbox GL JS 计算出现次数(geojson 属性)

algorithm - 确定 M 的值,M 是否取决于 k?

algorithm - 在 3D 空间中追踪 2D 多边形 - 合适的算法?

c++ - 如何找到像参数一样传递的一些数字的最大序列?

r - 将向量添加到 R 列表中子列出的每个数据帧

javascript - 忽略@RenderBody()

javascript - AngularJS ng-repeat 和 json 数据的问题

swift - 如何检索 firebase 数据库值来计算平均值

json - 解析字典行为奇怪