Как перемешать (shuffle) массив в JavaScript?

Как перемешать (shuffle) массив в JavaScript?

JavaScript – один из самых популярных языков программирования, широко используемый для разработки веб-приложений. Часто при работе с массивами возникает необходимость перемешать их элементы. В этой статье мы рассмотрим 10 способов перемешивания массива в JavaScript.

1. Использование алгоритма Фишера-Йетса (Fisher-Yates)

Алгоритм Фишера-Йетса – один из наиболее эффективных способов перемешивания массива. Он работает следующим образом:

function shuffle(array) {
  let currentIndex = array.length, temporaryValue, randomIndex;

  while (0 !== currentIndex) {

    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}

2. Использование метода sort() с функцией сравнения

Метод sort() позволяет отсортировать элементы массива. Можно использовать этот метод с функцией сравнения, которая будет случайным образом менять порядок элементов:

function shuffle(array) {
  array.sort(() => Math.random() - 0.5);
  return array;
}

3. Использование метода map() и Math.random()

Метод map() позволяет применить функцию к каждому элементу массива и создать новый массив. Можно использовать этот метод в сочетании с Math.random(), чтобы перемешать элементы в новом массиве:

function shuffle(array) {
  return array.map(a => [Math.random(), a])
    .sort((a, b) => a[0] - b[0])
    .map(a => a[1]);
}

4. Использование рекурсии

Рекурсивная функция может быть использована для перемешивания массива. Она будет рекурсивно вызывать себя, пока не будет достигнут конец массива:

function shuffle(array) {
  if (array.length === 0) {
    return array;
  }

  const randomIndex = Math.floor(Math.random() * array.length);
  const [removed] = array.splice(randomIndex, 1);

  return [removed].concat(shuffle(array));
}

5. Использование метода reduce()

Метод reduce() позволяет применить функцию к аккумулятору и каждому элементу массива, возвращая одно значение. Можно использовать этот метод для перемешивания массива:

function shuffle(array) {
  return array.reduce((acc, current) => {
    const randomIndex = Math.floor(Math.random() * acc.length);
    acc.splice(randomIndex, 0, current);
    return acc;
  }, []);
}

6. Использование рекурсивного метода pop()

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

function shuffle(array) {
  if (array.length === 0) {
    return array;
  }

  const randomIndex = Math.floor(Math.random() * array.length);
  const removedItem = array.splice(randomIndex, 1);
  return [...shuffle(array), ...removedItem];
}

7. Использование библиотеки Lodash

Lodash – это популярная библиотека JavaScript, которая предоставляет множество полезных функций для работы с данными. Одна из таких функций – shuffle() – позволяет перемешать массив:

const shuffledArray = _.shuffle(array);

8. Использование метода Math.random() и собственной функции shuffle()

Можно написать собственную функцию shuffle(), используя метод Math.random() и цикл:

function shuffle(array) {
  const shuffledArray = [];

  while (array.length) {
    const randomIndex = Math.floor(Math.random() * array.length);
    const [removed] = array.splice(randomIndex, 1);
    shuffledArray.push(removed);
  }

  return shuffledArray;
}

9. Использование генератора случайных чисел

Можно использовать генератор случайных чисел, такой как Math.random(), для создания случайного индекса и перемешивания массива:

function shuffle(array) {
  const random = () => Math.floor(Math.random() * 2) - 1;

  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }

  return array;
}

10. Использование алгоритма Таскера (Tascher’s algorithm)

Алгоритм Таскера – это модифицированная версия алгоритма Фишера-Йетса, который работает быстрее для больших массивов:

function shuffle(array) {
  let currentIndex = array.length, temporaryValue, randomIndex;

  while (0 !== currentIndex) {
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}

В этой статье мы рассмотрели 10 способов перемешивания массива в JavaScript. Выберите подходящий для ваших нужд и используйте его в своих проектах.

Читайте так же  13 причин, почему jQuery или DOM-методы не находят элемент