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

3

我希望能够找到一种高效的方式将一系列数值映射到另一个值。例如:

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

这里的值没有遵循任何规律。一种解决方案是使用条件语句(if-else),但是随着值的集合增加,语句数量会增加,并且难以维护。那么有没有其他优雅而高效的方法可以实现这一点呢?

1个回答

2

由于这些范围是连续的,你可以尝试通过起始数字进行映射,然后使用二分搜索查找值:

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接