Skip to content

Commit

Permalink
Fixes issue #288: Function hangs when selecting huge number of keys f…
Browse files Browse the repository at this point in the history
…rom huge array
  • Loading branch information
kukawski committed May 24, 2016
1 parent a9c687a commit 173ce19
Showing 1 changed file with 25 additions and 31 deletions.
56 changes: 25 additions & 31 deletions src/php/array/array_rand.js
@@ -1,38 +1,32 @@
module.exports = function array_rand (input, numReq) { // eslint-disable-line camelcase
// discuss at: http://locutus.io/php/array_rand/
// original by: Waldo Malqui Silva (http://waldo.malqui.info)
// example 1: array_rand( ['Kevin'], 1 )
// returns 1: 0
// discuss at: http://locutus.io/php/array_rand/
// original by: Waldo Malqui Silva (http://waldo.malqui.info)
// reimplemented by: Rafał Kukawski
// example 1: array_rand( ['Kevin'], 1 )
// returns 1: 0

var indexes = []
var ticks = numReq || 1
var checkDuplicate = function (input, value) {
var exist = false
var index = 0
var il = input.length
while (index < il) {
if (input[index] === value) {
exist = true
break
}
index++
}
return exist
}
// By using Object.keys we support both, arrays and objects
// which phpjs wants to support
var keys = Object.keys(array);

if (Object.prototype.toString.call(input) === '[object Array]' && ticks <= input.length) {
while (true) {
var rand = Math.floor((Math.random() * input.length))
if (indexes.length === ticks) {
break
}
if (!checkDuplicate(indexes, rand)) {
indexes.push(rand)
}
}
if (typeof num === 'undefined' || num === null) {
num = 1;
} else {
indexes = null
num = +num;
}

if (isNaN(num) || num < 1 || num > keys.length) {
return null;
}

// shuffle the array of keys
for (var i = keys.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1)); // 0 ≤ j ≤ i

var tmp = keys[j];
keys[j] = keys[i];
keys[i] = tmp;
}

return ((ticks === 1) ? indexes[0] : indexes)
return num === 1 ? keys[0] : keys.slice(0, num);
}

0 comments on commit 173ce19

Please sign in to comment.