2015-09-23 3 views
-2

Прежде всего, извините за длинный титул, я действительно не знал, как это лучше сказать.Почему добавление [0] после подсчета удаления в splice() возвращает только число?

В середине решения _.shuffle в подчеркивании я столкнулся с использованием сращивания. Вот мой исходный код:

shuffle = function(array) { 
    var shuffledArray = []; 
    var total = array.length; 
    var copiedArray = array.slice(); 
    while (total){ 
    var randomNum = Math.floor(Math.random() * total); 
    shuffledArray.push(copiedArray.splice(randomNum,1)); 
    total--; 
    } 
    return shuffledArray; 
}; 
var originArray = [1, 2, 3, 4]; 
console.log(shuffle(originArray)); 

Однако после тестирования только я понял, что это будет возвращать каждое значение внутри а [], а не только значения.

т.е.

[ [ 4 ], [ 3 ], [ 1 ], [ 2 ] ] 
//instead of [ 4, 3, 1, 2] 

Когда я изменил эту линию (добавлен '[0]' после того, как deleteCount в сращивания)

shuffledArray.push(copiedArray.splice(randomNum,1)); 

в этот

//edited 
shuffledArray.push(copiedArray.splice(randomNum,1)[0]); 

возвращение массива, Я получаю то, что я хотел, то есть

[ 3, 1, 2, 4 ] //values are not in [ ] 

Может кто-нибудь объяснить, как добавление [0] после того, как splice() заставляет значение не возвращаться в [] или почему не имеет [0]?

+1

'1 [0]' return _undefined_, поэтому вы вызываете то же, что и 'copiedArray.splice (randomNum)' – Grundy

+1

. Я не совсем понимаю, что вы пытаетесь сделать? – Grundy

+1

@Grundy: '1 [0]' действительно 'undefined', но' copiedArray.splice (randomNum) 'и' copiedArray.splice (randomNum, undefined) '** не ** то же самое. –

ответ

-1

Старайтесь не изобретать велосипед! http://php.net/manual/fr/function.shuffle.php

Если вы действительно хотите, попробуйте это в то время:

while (total){ 
    var randomNum = Math.floor(Math.random() * total); 
    ShuffledArray[] = array[randomNum]; //add an item to next pos 
    unset(array[randomNum]); //remove the item added 
    array = array_values(array); //reindex array 
    total--; 
    } 

удачи!

1

splice возвращает массив. Когда вы нажимаете массив в массив, вы получаете массив массивов. Добавив [0], вы нажимаете первый элемент массива. Это не странность Javascript - это вполне разумно.

+0

Спасибо, я просто новый, просто пытаюсь понять логику. – Tinah

+0

@ Тина Это очень странное недоразумение, я должен сказать. Напуганно, я могу представить, что это работает так, как вы (ошибочно) ожидаете на каком-то небезопасном языке, таком как C в некоторых конкретных условиях, - и в то же время негодяй в реальном мире. – Luaan

+0

Я думаю, что я был более смущен, когда думал, что мой код «copiedArray.splice (randomNum, 1 [0]» теперь, когда я понял эту ошибку, имеет смысл. – Tinah

0

Как я подозревал и был подтвержден в комментариях, вы использовали copiedArray.splice(randomNum,1)[0], а не copiedArray.splice(randomNum,1[0]).

EDIT: Это был оригинальный вопрос, и он был отредактирован.

И так как splice возвращает массив (в вашем случае массив с одним номером), взятие первого элемента массива достигает именно того, что вы хотели.

0

Splice возвращает массив удаленных элементов. Добавив [0], вы эффективно выбираете первый элемент в возвращаемом массиве.