У меня есть массив объектов, например.
var usersGoing = [
{ user: 0 },
{ user: 1 },
{ user: 2 },
{ user: 3 },
{ user: 4 }
];
Мне нужно перетасовать этот массив так, чтобы ни один объект не оставался в том же индексе, что и при его создании, например:
[
{ user: 3 },
{ user: 2 },
{ user: 4 },
{ user: 0 },
{ user: 1 }
]
ИМПЕРАТИВНО, чтобы результирующий массив был отсортирован таким образом, так как каждый из этих пользовательских объектов будет назначен другому пользовательскому объекту.
Я пробовал несколько разных алгоритмов сортировки, включая Fisher-Yates, и я попытался использовать Underscore.js '_.shuffle(), и этот вариант из Kirupa Перетасовка массива в JavaScript:
function shuffleFY(input) {
for (var i = input.length-1; i >=0; i--) {
var randomIndex = Math.floor(Math.random()*(i+1));
var itemAtIndex = input[randomIndex];
input[randomIndex] = input[i];
input[i] = itemAtIndex;
}
return input;
}
Ничего, что я пробовал, работает. Помощь?
ОБНОВЛЕНО: я отметил ответ как правильно ниже, поскольку ключевые моменты цикла Sattolo соблюдались правильно. Кроме того, это не дубликат случайных чисел в случайном порядке без повторения в Javascript/PHP, поскольку этот вопрос имеет дополнительное требование к результирующему массиву, не только не содержащему дубликатов, но также не может содержать элементы в их исходной позиции индекса.