Javascript: генерация и хранение случайных розыгрышей без замены

Я пытаюсь использовать Javascript для создания массива, беру два случайных уникальный из массива, а затем присваиваю полученные значения таблице HTML. Мой подход состоял в том, чтобы создать массив, взять случайное, создать новый массив без нарисованного значения, а затем взять случайное число из нового массива как способ взять два случайных числа без замены.

Я предоставил минимальный пример того, что я сделал для этого, но он не работает. Я хотел бы, чтобы значения, присвоенные таблице HTML, в конечном итоге были двумя уникальными значениями (например, «a», «b») из массива foo. Это не работает, потому что значение == bar_a ниже не удалит значение, присвоенное массиву bar_a, потому что bar_a — это массив, а не стоимость массива?

Хотя эта почта обращается к рисунку без замены, он не дает примера использования строк или объясняет, как сохранить оба числа, и неясно, почему они используют splice(), а не filter()

    // Define array containing the set of values we'll randomly assign to A or B
    var foo = ["a", "b", "c", "d"];

    // Initialize variables to hold the value for A and B
    var bar_a=  [""];
    var bar_b=  [""];

    // Randomly draw from foo, save for A
    bar_a =foo[Math.floor(Math.random()*foo.length)];

    // Remove the drawn value from the array, create new array
    var foo_filtered = array.filter(function(value, index, arr){
        return value == bar_a;
        });

    // Randomly draw from foo_filtered, save for B
    bar_b = foo_filtered[Math.floor(Math.random()*foo_filtered.length)];

    // Assign attributes and values to their placeholders (a1, b1) in a HTML table
     document.getElementById("a1").innerHTML = bar_a;
     document.getElementById("b1").innerHTML = bar_b;

Связанный ответ использует splice, потому что он изменяет исходный массив, а это именно то, что вам нужно, поскольку вам не нужна замена. Посмотрите здесь: jsfiddle.net/Лрфхагью

Gerardo Furtado 01.04.2019 05:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
238
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша логика условия фильтра обратная. Вам нужны значения, которые не равны bar_a.

Вам также нужно изменить array.filter на foo.filter

    // Define array containing the set of values we'll randomly assign to A or B
    var foo = ["a", "b", "c", "d"];

    // Initialize variables to hold the value for A and B
    var bar_a=  [""];
    var bar_b=  [""];

    // Randomly draw from foo, save for A
    bar_a =foo[Math.floor(Math.random()*foo.length)];

    // Remove the drawn value from the array, create new array
    var foo_filtered = foo.filter(function(value, index, arr){
        return value !== bar_a;
                  // ^^ not equal
        });

    // Randomly draw from foo_filtered, save for B
    bar_b = foo_filtered[Math.floor(Math.random()*foo_filtered.length)];

    // Assign attributes and values to their placeholders (a1, b1) in a HTML table
     document.getElementById("a1").innerHTML = bar_a;
     document.getElementById("b1").innerHTML = bar_b;
A: <span id = "a1"></span>   B: <span id = "b1"></span>

Хороший улов на array.filter. Эта работа, и я принимаю ответ, но есть ли компромисс между этим и использованием сращивания? Как это будет выглядеть при использовании сплайсинга? Новичок в Javascript и учится на работе, собирая вещи вместе.

user3614648 01.04.2019 05:51

Зависит от того, нужно ли вам делать все это снова или нет, и вам понадобится неповрежденный исходный массив. Это можно упростить множеством способов, но я сосредоточился только на том, чтобы заставить работать то, что у вас есть.

charlietfl 01.04.2019 05:53

Другие вопросы по теме