Фишер-Йейтс Шафл в Javascript

Новичок в JS и в настоящее время учусь в колледже. Для моего текущего проекта JS я создаю карточную игру. Я начал думать о том, как случайным образом перемешать карты, и я приблизился к тому, что делает алгоритм Фишера-Йейтса Шафла - вторая программа на этой странице. Однако я не понимаю, что именно [0] делает после метода сплайсинга. Это то, что сдвигает / сжимает массив? Если да, я не могу найти другие примеры / документы об этом.

function shuffle(array) {
  var copy = [], n = array.length, i;

  // While there remain elements to shuffle…
  while (n) {

    // Pick a remaining element…
    i = Math.floor(Math.random() * n--);

    // And move it to the new array.
    copy.push(array.splice(i, 1)[0]);
  }

  return copy;
}

2 ответа

Решение

array.splice(i, 1) вырезает iэлемент array и возвращает его как массив с одним значением (так же, как array.splice(i, 2) будет вырезать iи i+1-ый элемент и вернуть их как массив из двух элементов). затем [0]простая операция индексации выбирает этот единственный элемент из этого массива (так как нам не нужен массив); этот единственный элемент затем добавляется copy с помощью copy.push,

Более знакомое использование операции индексации:

array = [4, 7, 2, 10];
array[0]
// => 4
array[1]
// => 7

array = [18];
array[0]
// => 18

array.splice() возвращает массив, но при перемешивании вы хотите взять случайную карту из неизвестной позиции и поместить ее в новый массив (перемешанный). Теперь вы поймете, что вы не хотите снова добавлять подобный массив, выполнив copy.push(array.splice(i, 1) так как это добавит весь возвращаемый массив для копирования массива, и случайность вашего перемешивания будет уменьшена, что, в свою очередь, приведет к зависимому результату в вашей игре, потому что массив будет похож (~) на последний с несколькими перевернутыми битами. Добавление [0] в array.splice(i, 1) гарантирует, что вы копируете только один элемент из всего массива результатов, возвращенного за раз, что приводит к большей случайности.

Другие вопросы по тегам