Кто-нибудь может объяснить, пожалуйста, как работает эта функция?

#javascript #function

Вопрос:

 function shuffle(o) {
    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = 
    o[j], o[j] = x);
    return o;
};

 

Не совсем уверен, что делает последняя часть

Комментарии:

1. Последняя часть возвращает массив (поскольку функция переупорядочивает свои элементы на месте).

2. Похоже на какой-то уменьшенный код или кого-то «умного». Лучше получить исходный код или спросить автора. Кстати, «последняя часть» расплывчата. Я имею в виду, что точка с запятой (последний символ кода) на самом деле не нужна, но сообщает компилятору, что предшествующее ей утверждение завершено. Что касается for выражения, у MDN есть хорошая документация на этот счет.

Ответ №1:

Это похоже на то, что кто — то принимает вызов «Я могу сделать это в одной строке», что является очень аккуратным и забавным вызовом, но ему нет места в реальном мире кода- ваши коллеги возненавидят вас. Так что давайте расширим его до чего-нибудь читабельного:

 function shuffle(o) {
    // iterate over the entire input array "o"
    for(var i = o.length - 1; i; i--) {
      // get the "current" item and save it in variable "x"
      var x = o[i];
      // generate a random number within the bounds of the array
      var j = parseInt(Math.random() * (i   1));

      // The next two lines essentially swap item[i] and item[j]
      // set the "current" item to a randomly picked item
      o[i] = o[j];
      // put the "current" item in the random position
      o[j] = x;
    }

    return o;
};
 

Ответ №2:

 function shuffle(inputArray) {
    let i = inputArray.length;

    while (i) {
        const j = parseInt(Math.random() * i); // generate random integer smaller than i (Math.random() generates random number between 0 and 1)
        i = i-1; 
        // swap elements on position i and j
        const element = inputArray[i];
        inputArray[i] = inputArray[j]
        inputArray[j] = x;
    }

    return inputArray;
};
 

Комментарии:

1. для нового программиста это преобразование из a for в a while немного помогает — попробуйте сделать это с исходным циклом 🙂