Вот моя попытка; слегка модифицированный алгоритм Фишера-Йейтса. Я не знаю, как сделать так, чтобы он был случайным.
const shuffleWithoutMovingFalsies = array => {
const newArray = [...array];
const getRandomValue = (i, N) => ~~(Math.random() * (N - i) + i);
newArray.forEach((elem, i, arr, j = getRandomValue(i, arr.length)) => arr[i] && arr[j] && ([arr[i], arr[j]] = [arr[j], arr[i]]));
return newArray;
}
const array = [1, 2, null, 3, null, null, 4, 5, 6, null];
const shuffledArray = shuffleWithoutMovingFalsies(array);
console.log(shuffledArray);
Все, что я сделал, это добавил arr[i] && arr[j] &&
в качестве проверки, чтобы убедиться, что оба элемента, которые собираются поменять местами, НЕ falsy
.