从数组中获取最接近的数字匹配,必须更低

时间:2013-09-16 09:50:12

标签: javascript jquery

我有一系列数字,如:

[10000 , 15000 , 20000 , 25000 , 30000]

我得到一个变量,它会变化,可以在数组范围内的任何地方,例如23,500。

我需要从数组中找到最接近的数字,但它也必须低于给定的变量。

最简单的方法是什么? (可以使用jQuery)

编辑:

我试过这个:

salary = data[3]; // what im trying it on, this = 60001


    // the array is built from a select
$.each($('#home-salary-from').children(), function(){

    salaryArray.push($(this).attr('id'))

})

    //returns [0, 10000 , 15000 , 20000 ...] etc up to 100000.

salaryFrom = salaryArray.filter( function(i){ return i <= salary }).pop();

console.log(salaryFrom)
    //always returns 100000 ??

5 个答案:

答案 0 :(得分:3)

只是为了好玩:

var max = 23500, 
    arr = [10000 , 15000 , 20000 , 25000 , 30000],
    closest;

// Solution 1 
    closest = arr.push( max ) && arr.sort()[ arr.indexOf( max ) - 1 ];

// Solution 2
    closest = arr.filter( function(i){ return i <= max }).pop();

// Solution 3
    closest = arr.sort(function(a,b){ return max >= b ? 1 : -1;  })[0];

// Solution 4
    closest = Math.max.apply(null,arr.filter(function(i){ return max - i >= 0 }));

答案 1 :(得分:0)

DEMO

var x = [10000, 15000, 20000, 25000, 30000];

function find_closest(y) {
    var z = [];
    $.each(x, function (i, val) {
        if (y > val) {
            z.push(val);
        }
    });
    z.sort();
    return (z[z.length - 1]);
}

alert(find_closest(23500));

答案 2 :(得分:0)

如下:

Array.prototype.closest = function(value) {
    var res = 0;
    for (var i=0; i<this.length; i++) {
        if (this[i] > res && this[i] < value) res=this[i];
    }
    return res;
}

用作:

var numb = [10000 , 15000 , 20000 , 25000 , 30000].closest(23500);

FIDDLE

答案 3 :(得分:0)

var arr = [10000, 15000, 20000, 25000, 30000];
var v = 23500;

var out = arr
  .map(function(el) { return el - v; })
  .filter(function(el) { if (el < 0) return el; });

var found = arr[out.indexOf(Math.max.apply(null, out))] || 'No match';

Fiddle

答案 4 :(得分:0)

我们可以使用这些简单的代码snnipets获得最接近的值 -

&#13;
&#13;
    function getClosestValue(array,value)
    {
      var closestValue = null;
      for(i=0; i<=array.length;i++)
      {
         if(array[i] > value && 
            (closestValue == null || array[i] < closestValue))
        {
    	   closestValue = array[i];
        }
    
    }
    
    return closestValue;
    }
    
    var numb = [10000 ,24000 ,20000 ,23700, 25000];
    alert(getClosestValue(numb,23500));
&#13;
&#13;
&#13;