Сокращение функции random

250
07 июля 2017, 08:07

Написал функцию рандома для чисел и массивов с исключением. Всё работает, но проблема в том, что код вышел уж слишком большим для такой функции. Как можно оптимизировать (уменьшить) данную функцию?

(function() { 
  $.random = function(int__min, int__max, exceptions, tof__integer) { 
    if (int__min instanceof Array) { 
      var int__min_length = int__min.length - 1, 
        arr_exceptions = null; 
 
      if (int__max instanceof Array) { 
        arr_exceptions = []; 
 
        $.each(int__max, function(idx, el) { 
          arr_exceptions[arr_exceptions.length] = int__min.indexOf(el); 
        }); 
      } else { 
        arr_exceptions = int__min.indexOf(int__max); 
      }; 
 
      return int__min[$.random(0, int__min_length, arr_exceptions, true)]; 
    } else if (typeof int__min === 'number' && typeof int__max === 'number') { 
      if (!int__min) int__min = 0; 
      if (!int__max) int__max = 10; 
      if (int__min > int__max) { 
        var int__min_val = int__min, 
          int__max_val = int__max; 
 
        int__min = int__max_val; 
        int__max = int__min_val; 
      }; 
 
      var int__random = null; 
      if (tof__integer === undefined || tof__integer === true) { 
        int__random = Math.floor(Math.random() * (int__max + 1 - int__min) + int__min); 
      } else { 
        int__random = Math.random() * (int__max + 0.1 - int__min) + int__min; 
      }; 
 
      if (typeof exceptions === 'number' || typeof exceptions === 'string') { 
        if (exceptions !== int__random) { 
          return int__random; 
        } else { 
          return $.random(int__min, int__max, exceptions, tof__integer); 
        }; 
      } else if (exceptions instanceof Array) { 
        var tof__resolution = true; 
 
        $.each(exceptions, function(idx, el) { 
          if (int__random === el) tof__resolution = false; 
        }); 
 
        if (tof__resolution) { 
          return int__random; 
        } else { 
          return $.random(int__min, int__max, exceptions, tof__integer); 
        }; 
      } else { 
        return int__random; 
      }; 
    } else { 
      console.error('UARR.RANDOM: Invalid values!'); 
    }; 
  }; 
})(); 
 
(function() { 
  console.log( $.random( 0, 10, null, false ) ); 
  console.log( $.random( 0, 10, null, true ) ); 
  console.log( $.random( 0, 10, [5, 6, 7, 8] ) ); 
   
  console.log( $.random( ['a', 'b', 'c'], 'a' ) ); 
  console.log( $.random( ['a', 'b', 'c'], ['a', 'c'] ) ); 
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

Для чисел:

$.random( a, b, c, d );
a - Минимальное число
b - Максимальное число
c - Исключения (число, которое не нужно показывать. Можно указывать массивом)
d - Целые числа или нет (true/false)

Для массивов:

$.random( a, b );
a - Массив данных
b - Исключения (значения, которые не нужно показывать. Можно указывать массивом)
Answer 1

Не все кейсы понятны (например вот это немного порвало мне мозг -

console.log( $.random( 0, 10, [5, 6, 7, 8] ) );

какой тут смысл в exceptions?

Но вот я сделял, в два раза короче и без жуквери:

$ = {}; 
$.random = function(from, ...args) { 
    let results = []; 
    let exceptions; 
    switch(true){ 
        case (from instanceof Array): 
            exceptions = (args[0] && !(args[0] instanceof Array)) ? [args[0]] : (args[0] || []); 
            results = from; 
            break; 
        case args[2]: 
            exceptions = args[1] || []; 
            for(let i = from; i<=args[0]; i++) results.push(i); 
            break; 
        default: 
            exceptions = args[1] || []; 
            do results = from + (args[0]-from)*Math.random(); 
            while(exceptions.includes(results)); 
            return results; 
    } 
    results = results.filter(el => !exceptions.includes(el)); 
    return results[Math.floor(Math.random()*results.length)]; 
}; 
 
console.log( $.random( 0, 10, null, false ) ); 
console.log( $.random( 0, 10, null, true ) ); 
console.log( $.random( 0, 10, [5, 6, 7, 8], true ) ); 
console.log( $.random( ['a', 'b', 'c'], 'a' ) ); 
console.log( $.random( ['a', 'b', 'c'], ['a', 'c'] ) );

READ ALSO
Замена блоков друг другом

Замена блоков друг другом

Есть два ряда по 3 блока:

292
Возврат значения по URL из AJAX

Возврат значения по URL из AJAX

Привет всем, я скопипастил себе код для вызова URL, вызов срабатывает, но обработку возвращаемого значения сделать не получается

224
Неправильно работает событие onclick

Неправильно работает событие onclick

Добрый день, при нажатии на кнопку onclick='audioRecorderopen(this) спрашивает разрешение на микрофон и при нажатии на разрешить запись сразу стартует,...

280
this в unit тестах jasmine

this в unit тестах jasmine

Как в тестах Jasmine подменить созданному объекту другой this?

209