Вопрос о синтаксисе JavaScript в этом выражении -> copy.push (array.splice (i, 1) [0]) - PullRequest
0 голосов
/ 27 сентября 2018

Так что это вопрос синтаксиса, я читал документы MDN, но я не могу найти подобный пример.Я получил этот конкретный фрагмент кода здесь: https://bost.ocks.org/mike/shuffle/, когда я читал о рандомизированных массивах.

Вот полная функция:

    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;
    }

Теперь я использовал егои изменил его, чтобы он соответствовал моим потребностям, и он работал нормально (хотя сращивание было кошмаром, потому что оно продолжало уничтожать мои исходные данные), но смысл вот в этой строке:

copy.push(array.splice(i, 1)[0]);

Я ненавижу не понимать то, чтокажутся простыми, но что делает [0] в этом случае?Если я достану его, вся вещь сломается, но я не уверен, является ли она частью сращивания, или толчком, или это индекс нового массива или сращенного массива.Если кто-то может помочь пролить свет на это, я был бы очень признателен!

1 Ответ

0 голосов
/ 27 сентября 2018

Давайте разберемся

copy.push(array.splice(i, 1)[0]);

в том порядке, в котором оно "выполнено"

array.splice(i, 1);

array.splice(n, m) удаляет m элементы, начиная с индекса n и возвращает этиудалил элементы как массив ... так что в этом случае вы получите массив длиной 1 - назовем его x

, заменив x на array.splice(i, 1) в исходном коде, теперь у нас есть

copy.push(x[0]);

x[0] - это единственный элемент, удаленный из array, который помещается в массив copy

, чтобы предотвратить поступление массива входящих мутировал

function shuffle(array) {
    var copy = [], n = array.length, i;
    array = array.slice();
    // rest of code
}

Кстати, вы могли бы также сделать

copy.push(array.splice(i, 1).pop());

или

copy.push(array.splice(i, 1).shift());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...