Как перемешать элементы массива js

Аватар пользователя Aleksandr Litvinov
Aleksandr Litvinov
29 августа 2022

Простой способ перемешать массив:

array = array.sort(() => Math.random() - 0.5)

Правильный способ — использовать алгоритм тасования Фишера — Йетса:

const shuffle = (array) => {
  let m = array.length, t, i;

  // Пока есть элементы для перемешивания
  while (m) {

    // Взять оставшийся элемент
    i = Math.floor(Math.random() * m--);

    // И поменять его местами с текущим элементом
    t = array[m];
    array[m] = array[i];
    array[i] = t;
  }

  return array;
}
1 0
Аватар пользователя Виктория Аблаева
Виктория Аблаева
23 октября 2022

Есть еще один способ для перемешивания элементов массива. Он не очень удачный и является не очень эффективным, поэтому рассмотрим его только в качестве примера.
Напишем собственную функцию для перетасовки элементов массива.

const shuffle = (coll) => {
return Array(coll.length).fill(null) 
// возвращаем новый массив с такой же длиной и заполняем его null
        .map((_, i) => [Math.random(), i])
// на каждой итерации возвращаем новый массив, в котором рандомное число и индекс элемента
        .sort(([a], [b]) => a - b)
// сортируем по рандомному элементу в порядке возрастания
        .map(([, i]) => coll[i])
// возвращаем элемент по индексу, который был отсортирован
};

console.log(shuffle(numbers)); // => [10, 5, 3, 7, 2, 9, 1, 4, 6, 8]
console.log(shuffle(numbers)); // => [9, 2, 6, 1, 8, 5, 7, 10, 3, 4]
console.log(shuffle(numbers)); // => [8, 7, 10, 6, 3, 2, 9, 5, 4, 1]

Самый оптимальный способ для перемешивания элементов массива - это алгоритм тасования Фишера — Йетса, он рассмотрен выше.

0 0
Основы Frontend за 14 дней
  • 72 урока в онлайн-тренажере
  • 4 живых вебинара и масскодинг
  • Помощь наставника на весь период обучения

Есть что добавить? Зарегистрируйтесь

или войдите в аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Курсы по программированию на Хекслете

Backend-разработка

Разработка серверной части сайтов и веб-приложений

Frontend-разработка

Разработка внешнего интерфейса сайтов и веб-приложений и верстка

Создание сайтов

Разработка сайтов и веб-приложений на JS, Python, Java, PHP и Ruby on Rails

Тестирование

Ручное тестирование и автоматизированное тестирование на JS, Python, Java и PHP

Аналитика данных

Сбор, анализ и интерпретация данных на Python

Интенсивные курсы

Интенсивное обучение для продолжающих

DevOps

Автоматизация настройки локального окружения и серверов, развертывания и деплоя

Веб-разработка

Разработка, верстка и деплой сайтов и веб-приложений, трудоустройство для разработчиков

Математика для программистов

Обучение разделам математики, которые будут полезны при изучении программирования

JavaScript

Разработка сайтов и веб-приложений и автоматизированное тестирование на JS

Python

Веб-разработка, автоматическое тестирование и аналитика данных на Python

Java

Веб-разработка и автоматическое тестирование на Java

PHP

Веб-разработка и автоматическое тестирование на PHP

Ruby

Разработка сайтов и веб-приложений на Ruby on Rails

Go

Курсы по веб-разработке на языке Go

HTML

Современная верстка с помощью HTML и CSS

SQL

Проектирование базы данных, выполнение SQL-запросов и изучение реляционных СУБД

Git

Система управления версиями Git, регулярные выражения и основы командой строки