我试图找到一种有效的方法来将一系列值映射到另一个值。例如
1-9 -> 49
10-24 ->54
25-49 -> 59
50-74 -> 50
75-99 -> 49
100-150 -> 40
这里的值不遵循任何常规模式。一种解决方案是使用条件语句(if -else
)但是随着值集的增加,语句数量增加并且难以维护。那么还有其他优雅而有效的方法来实现这一目标吗?
答案 0 :(得分: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);