Как перетасовать массив в JavaScript неизменно? - PullRequest
0 голосов
/ 26 апреля 2018

Я знаю, что уже есть вопрос "как перемешать массив в JavaScript", но я не нашел конкретного вопроса о том, как перетасовать массив неизменным образом. Итак, каков лучший способ неизменного перемешивания массива в JavaScript?

Может быть, лучше взять ответ из https://stackoverflow.com/a/2450976/3022127 и просто скопировать сначала массив (внутри метода)?

Или, может быть, что-то вроде этого:

const shuffleArray = (arr) => {
  return arr
    .map(a => [Math.random(), a])
    .sort((a, b) => a[0] - b[0])
    .map(a => a[1])
}

(кажется довольно случайным https://jsfiddle.net/Lpy22x4c/1/)

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Просто используйте это решение, но установите новую переменную, равную вашему массиву, прежде чем выполнять перемешивание: Как я могу перемешать массив?

Так это будет выглядеть так:

 /**
 * Shuffles array in place.
 * @param {Array} a items An array containing the items.
 */
function shuffle(oldArray) {
  var j, x, i;
  var newArray = oldArray;
  for (i = newArray.length - 1; i > 0; i--) {
    j = Math.floor(Math.random() * (i + 1));
    x = newArray[i];
    newArray[i] = newArray[j];
    newArray[j] = x;
   }
   return newArray;
  } 
0 голосов
/ 26 апреля 2018

Копирование массива, а затем перетасовка на месте имеет смысл, да.

Альтернативно, реализация в вопрос, который вы связали , может быть легко скорректирована для создания нового массива, оставляя старый массив без изменений. Основным изменением является получение элемента для currentIndex: мы хотим получить его из нового массива, если он есть в новом массиве, или старого массива, если нет.

function shuffle(array) {
  var newArray = [];
  var currentIndex = array.length, temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    if (newArray.hasOwnProperty(currentIndex)) {
      temporaryValue = newArray[currentIndex];
    } else {
      temporaryValue = array[currentIndex];
    }
    newArray[currentIndex] = array[randomIndex];
    newArray[randomIndex] = temporaryValue;
  }

  return newArray;
}

// Used like so
var arr = [2, 11, 37, 42];
console.log("shuffled", shuffle(arr));
console.log("original", arr);
.as-console-wrapper {
  max-height: 100% !important;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...