Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.03.2022, 11:25
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 93

Дублируются данные в цикле
Всем привет, столкнулся с проблемой и вообще не понимаю как решить. Есть функция, которая на вход принимает массив из чисел (но он может быть и пустым), и создает несколько наборов чисел (равное tcount)
function createTickets(mas) {
    let ticket = ''
    let tcount = document.getElementById('tcount').value
    for (t = 0; t < tcount; t++) {
        let numbers = []
        numbers.splice(0, numbers.length);
        numbers.length = 0;
        console.log(numbers)
        numbers = generate(mas);
        let ticketItem = ''
        numbers.forEach(n => {
            ticketItem += `<div class="ticket-item" data-select="${n}">${n}</div>`
        })
        ticket += `<div class="ticket-block">${ticketItem}</div>`
        numbers = []
        console.log(numbers)
    }

    ticketslist.insertAdjacentHTML('beforeend', ticket)
    numbers = []
    createTicketsButton.disabled = true
    ticket = ''
}

и функция generate(), которая генерирует массив случайных чисел с учетом входящего параметра(массив mas).
function generate(mas) {
    let arr = []
    arr.splice(0, arr.length);
    arr.length = 0;
    let max_number, i, unic;
    arr = (mas.length != 0) ? mas : []
    max_number = 6;
    while (arr.length < 6) {
        do {
            unic = true;
            a = Math.floor(Math.random() * 36) + 1;
            for (i = 0; i < arr.length; i++) {
                if (a == arr[i]) {
                    // такое число уже было
                    unic = false;
                    break;
                }
            }
        } while (!unic) // повторить генерацию числа
        arr.push(a);
    }
    return arr
}

Проблема в том, что если массив mas пустой, все работает как надо, а если в нем есть элементы - дублирует набор чисел в количестве равном tcount Подскажите пожалуйста, в чем ошибка? Заранее спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 25.03.2022, 11:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

Volonter,
на всякий случай это
let numbers = []
        numbers.splice(0, numbers.length);
        numbers.length = 0;
        console.log(numbers)
        numbers = generate(mas);


равно этому
let numbers = generate(mas);


Сообщение от Volonter
// такое число уже было
не надо таких проверок, создайте массив нужных чисел, перемешайте и отрежьте нужный кусочек.
Ответить с цитированием
  #3 (permalink)  
Старый 25.03.2022, 12:47
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 93

Сообщение от рони Посмотреть сообщение
Volonter,
на всякий случай это

равно этому
let numbers = generate(mas);



не надо таких проверок, создайте массив нужных чисел, перемешайте и отрежьте нужный кусочек.
Знаю, это я уж совсем от безысходности написал, да так в коде и оставил, но проблему это не решает
Ответить с цитированием
  #4 (permalink)  
Старый 25.03.2022, 12:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

Volonter,
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .ticket-block {
            display: flex;
            width: 20em;
        }
        .ticket-item {
            text-align: center;
            font-size: 3em;
            border: 1px solid #000080;
            width: 100%;
        }
    </style>
</head>
<body>
    <input id="tcount" name="" type="number" min="1" max="6" value="2">
    <input id="createTicketsButton" name="" type="button" value="createTickets" onclick="createTickets()">
    <div id="ticketslist"></div>
    <script>
        function createTickets() {
            let tcount = +document.getElementById('tcount').value;
            let numbers = generate(36, 6);
            let ticket = ''
            for (t = 0; t < tcount; t++) {
                let ticketItem = '';
                numbers.next().value.forEach(n => {
                    ticketItem += `<div class="ticket-item" data-select="${n}">${n}</div>`
                })
                ticket += `<div class="ticket-block">${ticketItem}</div>`
            }
            ticketslist.insertAdjacentHTML('beforeend', ticket);
            createTicketsButton.disabled = true
        }
        function generate(length, limit) {
            let arr = Array(length);
            for (let i = 0; i < length; i++) {
                let k = Math.floor(Math.random() * length);
                let num = arr[k] || k + 1;
                arr[k] = arr[i] || i + 1;
                arr[i] = num;
            }
            return {
                [Symbol.iterator]() {
                    return this;
                },
                arr,
                next() {
                   
                    if (this.arr.length >= limit) {
                        return {
                            done: false,
                            value: this.arr.splice(0, limit)
                        };
                    } else {
                        return {
                            done: true
                        };
                    }
                }
            };
        }
    </script>
</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 25.03.2022, 12:58
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

Volonter,
тоже самое, вариант попроще для понимания...
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .ticket-block {
            display: flex;
            width: 20em;
        }
        .ticket-item {
            text-align: center;
            font-size: 3em;
            border: 1px solid #000080;
            width: 100%;
        }
    </style>
</head>
<body>
    <input id="tcount" name="" type="number" min="1" max="6" value="2">
    <input id="createTicketsButton" name="" type="button" value="createTickets" onclick="createTickets()">
    <div id="ticketslist"></div>
    <script>
        function createTickets() {
            let tcount = +document.getElementById('tcount').value;
            let numbers = generate(36);
            let limit = 6;
            let ticket = ''
            for (t = 0; t < tcount; t++) {
                if(numbers.length < limit) break;
                let ticketItem = '';
                numbers.splice(0,6).forEach(n => {
                    ticketItem += `<div class="ticket-item" data-select="${n}">${n}</div>`
                })
                ticket += `<div class="ticket-block">${ticketItem}</div>`
            }
            ticketslist.insertAdjacentHTML('beforeend', ticket);
            createTicketsButton.disabled = true
        }
        function generate(length) {
            let arr = Array(length);
            for (let i = 0; i < length; i++) {
                let k = Math.floor(Math.random() * length);
                let num = arr[k] || k + 1;
                arr[k] = arr[i] || i + 1;
                arr[i] = num;
            }
            return arr
        }
    </script>
</body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 25.03.2022, 14:04
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 93

Спасибо, но в том то и фишка, что обе функции принимают массив mas, и функция generate возвращает новый массив, в который входят числа из массива mas. В моем случае, если mas пустой то все работает как надо, а если нет - то в каждой итерации дублируется первый возвращенный функцией generate массив
Ответить с цитированием
  #7 (permalink)  
Старый 25.03.2022, 14:37
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,134

Volonter,
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ajax в цикле ivandrova AJAX и COMET 4 05.04.2017 06:26
Проблема получения объекта JSON espltd Элементы интерфейса 13 03.02.2016 14:55
Таймер до требуемой даты в цикле Drugpunker Events/DOM/Window 22 21.03.2014 08:52
Сортировка JSON данных в цикле Fareastaz jQuery 12 15.03.2013 20:20
Не совсем обычный фрейм и выезжающий текст при наводе на картинку. amaz245 Элементы интерфейса 35 25.12.2010 17:29