Рекурсивный вызов вашей существующей функции randomize()
не имеет смысла, потому что вы не передаете ему аргумент arr
, и вы ничего не делаете с его возвращаемым значением. Эта линия должна быть:
return randomize(arr);
... за исключением того, что к тому времени, он получает в этой строке вы переназначить arr
так, что он больше не относится к исходному массиву. Использование дополнительной переменной, как в следующей версии, должно работать.
Обратите внимание, что я также добавил тест, чтобы убедиться, что если массив имеет только один элемент, мы немедленно возвращаем этот элемент, потому что в этом случае каждый раз невозможно выбрать другой элемент. (Функция возвращает undefined
если массив пуст.)
function randomize(arr) {
if (arr.length < 2) return arr[0];
var num = Math.floor(Math.random()*arr.length);
if(num == this.lastSelected) {
return randomize(arr);
} else {
this.lastSelected = num;
return arr[num];
}
}
document.querySelector("button").addEventListener("click", function() {
console.log(randomize(["a","b","c","d"]));
});
<button>Test</button>
Обратите внимание, что, казалось, исходная функция будет возвращающей массив случайной индекса, но код, показанный в моем ответе возвращает случайный массив элемент.
Обратите внимание, что способ, которым вы вызываете свою функцию, означает, что внутри функции this
есть окно - не уверен, что это то, что вы намеревались; он работает, но в основном lastSelected
является глобальной переменной.
Учитывая, что я не намерен создавать глобальные переменные бесполезно, вот альтернативная реализация без глобальных переменных и без рекурсии, потому что, по моему мнению, простой цикл while является более семантическим способом реализации концепции «продолжайте пытаться до х бывает ":
var randomize = function() {
var lastSelected, num;
return function randomize(arr) {
if (arr.length < 2) return arr[0];
while (lastSelected === (num = Math.floor(Math.random()*arr.length)));
lastSelected = num;
return arr[num];
};
}();
document.querySelector("button").addEventListener("click", function() {
console.log(randomize(["a","b","c","d"]));
});
<button>Test</button>
Если он всегда отличается от предыдущего номера, то он не является случайным. – stark
ОДОБРЕННО, что число будет таким же, как и у второго, или является реальным требованием для обработки всего массива в случайном порядке? – nnnnnn
Совсем нет. Вы выбираете случайное число из [0, arr.length). – Li357