2013-09-16 4 views
-2

У меня есть массив чисел, например:Получить наиболее близкое число из массива, должен быть ниже

[10000 , 15000 , 20000 , 25000 , 30000] 

я получаю переменную, которая будет меняться и может быть в любом месте в пределах массивы в диапазоне, например 23500.

Мне нужно найти самое близкое число из массива, но оно должно быть ниже заданной переменной.

Что было бы самым простым способом сделать это? (Можно использовать JQuery)

EDIT:

Ive попытался это:

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 ?? 
+0

Ваш массив отсортирован? Как насчет модифицированного дихотомического поиска? – Aristide

+4

'var max = 23500, closeest = [10000, 15000, 20000, 25000, 30000] .filter (function (i) {return i <= max}). Pop()' – pawel

+3

'get Homework(); if (noClue) postToStackOverflow(); ' –

ответ

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

+0

Предполагая отсортированный массив:' for (var i = 0; i < this.length; i ++) {if (this [i]> value) возвращает это [i-1] || 0; } 'http://jsfiddle.net/zNrny/2/ – pawel

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

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 })); 
+0

wow awesome. Первое решение чего-то не хватает: '... arr.sort (function (a, b) {return a-b}) ...' – ProblemsOfSumit

0

Мы можем получить наиболее близкое значение этих простых кодов snnipets -

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

Смежные вопросы