×

Welcome to TagMyCode

Please login or create account to add a snippet.
0
0
 
0
Added: Dec 24, 2017 11:34 AM
Modified: Jan 11, 2018 7:27 PM
Views: 2
Tags: no tags
/**
* Поиск ближайшего числа (приоритет большего)
* @param numbs {array} Массив чисел для поиска
* @param find {int} Число которое ищем
* @param step {float} Шаг, с которым нужно двигаться в цикле
*
* @return boolean | {
* find: {int} Искомое число
* left: {int} Левое число в массиве по искомому числу
* right: {int} Правое число в массиве по искомому числу
* near: {int} Результат поиска
* }
*/
  1. /**
  2.  * Поиск ближайшего числа (приоритет большего)
  3.  * @param numbs {array} Массив чисел для поиска
  4.  * @param find  {int}   Число которое ищем
  5.  * @param step  {float} Шаг, с которым нужно двигаться в цикле
  6.  *
  7.  * @return false | {
  8.  *    find:  {int} Искомое число
  9.  *    left:  {int} Левое число в массиве по искомому числу
  10.  *    right: {int} Правое число в массиве по искомому числу
  11.  *    near:  {int} Результат поиска
  12.  * }
  13.  */
  14. var findNearest = function (numbs, find, step) {
  15.    if (!numbs.length || isNaN(find) || find*1 < step) {
  16.        return false;
  17.    }
  18.  
  19.    var nearest = {
  20.        step: step * 1 || 0.1,
  21.        find: find * 1
  22.    };
  23.  
  24.    for(var num in numbs) {
  25.        if (numbs[parseInt(num)] * 1 > nearest.find) {
  26.            nearest.left = numbs[num * 1 - 1] * 1;
  27.            nearest.right = numbs[num * 1] * 1;
  28.            break;
  29.        }
  30.    }
  31.  
  32.    var i = nearest.find,
  33.        j = nearest.find,
  34.        z = 0;
  35.  
  36.    while(true) {
  37.        i = (i + nearest.step).toFixed(1) * 1;
  38.        j = (j - nearest.step).toFixed(1) * 1;
  39.  
  40.        if (i === nearest.right) {
  41.            nearest.near = nearest.right;
  42.            return nearest;
  43.        }
  44.  
  45.        if (j === nearest.left) {
  46.            nearest.near = nearest.left;
  47.            return nearest;
  48.        }
  49.  
  50.           // FIXME убрать этот ограничитель (или увеличить, если длинна массива более 100 элементов)
  51.        if (z === 100) {
  52.            return false;
  53.        } else {
  54.            z++;
  55.        }
  56.    }
  57. };