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

有一个数组:

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

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

阅读 17.3k
7 个回答

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

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

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];}

你的数组是有序的还是无序的?
如果是无序的,就从头查找,复杂度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;
}

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

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

看下underscore 的sortBy

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题