首页 > js中怎么判断任一个数值接近数组中的某个值?

js中怎么判断任一个数值接近数组中的某个值?

有一个数组:

arr  = [0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000];

怎么确定任意一个0.1-1000之间的数接近arr中的哪个值?(比如30接近的数就是20)


看下underscore 的sortBy


你的数组是有序的还是无序的?
如果是无序的,就从头查找,复杂度O(N):

function closest(arr, num){
    var ret = arr[0];
    var distance = Math.abs(ret - num);
    for(var i = 1; i < arr.length; i++){
        var newDistance = Math.abs(arr[i] - num);
        if(newDistance < distance){
            distance = newDistance;
            ret = arr[i];
        }
    }
    return ret;
}

如果是有序的,用二分查找,复杂度O(lgN):

function closest(arr, num){
  var left = 0;
  var right = arr.length - 1;

  while(left <= right){
    var middle = Math.floor((right + left) / 2);
    if(right - left <= 1){
      break;
    }
    var val = arr[middle];
    if(val === num){
      return middle;
    }
    else if(val > num){
      right = middle;
    }
    else{
      left = middle;
    }
  }

  var leftValue = arr[left];
  var rightValue = arr[right];
  return rightValue - num > num - leftValue ? leftValue : rightValue;
}

sort一步搞定:

假设要比较数是N,那么:

arr.sort(function(a, b) {
  return Math.abs(a - N) - Math.abs(b - N);
})[0];

就是你要的结果。


既然题主说有序,那么直接二分查找


var arr  = [0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000,1,23,4,5,6,7,8]; //无所谓顺序
arr.sort(function(a,b){return a-b;}); // 从小到大排序
//比如查20
var index = arr.indexOf(20);
var result = 20-arr[index-1] < arr[index+1]-20 ? arr[index-1] : arr[index+1];

逐个求差的绝对值,最小的那个不就是最接近的么,简单写了下

function limit(arr, num){
    var newArr = [];
    arr.map(function(x){
        // 对数组各个数值求差值
        newArr.push(Math.abs(x - num));
    });
    // 求最小值的索引
    var index = newArr.indexOf(Math.min.apply(null, newArr));
    return arr[index];}

1.数组排序
2.二分查找


一楼的答案很原始,其实直接把要比较的这个数push到那个数组里面去,然后sort排序,从小到大or从大到小都可以,检测这个数和前面一个数以及和后面一个数绝对值差哪个小,小的那个就是最接近的数,总共四行代码吧

【热门文章】
【热门文章】