2016-10-12 6 views
0

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

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 
+0

Спасибо @Amadan! – Ludo757

+0

Итак, я вдумался в это. Я не понимаю, что для меня «[0]» избыточно, поскольку мы просто берем один элемент из массива, так как диапазон сплайсинга равен '(i, 1)'. – Ludo757

+0

'splice' возвращает массив. 'push' хочет одно значение. Одноэлементный массив - это не то же самое, что и его элемент. Это похоже на попытку положить мешочек с томатом в ваш блендер, утверждая, что «ну, мне нужен один помидор для этого соуса, а в сумке только один помидор, оставшийся в нем, так почему бы и нет?». Сначала вам нужно вытащить помидор из сумки, потому что эти пластиковые сетчатые волокна немного на стороне жевательной стороны. – Amadan

0

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

+0

Спасибо @ Cyclotron3x3, теперь имеет смысл. Очень признателен. – Ludo757

+0

то, что я не понимаю, заключается в том, что случайность задается случайным числом 'i', которое будет выбирать случайный индекс массива для сращивания, тогда результат будет вытолкнут в конце нового массива' copy' , поэтому в итоге вся индексация элементов нового массива будет случайной (каждая итерация толкает элемент в конце массива). Так не '[0]' избыточно здесь? – Ludo757