Получение случайного значения из массива JavaScript - PullRequest
660 голосов
/ 29 декабря 2010

Рассмотрим:

var myArray = ['January', 'February', 'March'];    

Как выбрать случайное значение из этого массива с помощью JavaScript?

Ответы [ 23 ]

2 голосов
/ 08 декабря 2017

Рекурсивная, автономная функция, которая может возвращать любое количество элементов (идентично lodash.sampleSize ):

function getRandomElementsFromArray(array, numberOfRandomElementsToExtract = 1) {
    const elements = [];

    function getRandomElement(arr) {
        if (elements.length < numberOfRandomElementsToExtract) {
            const index = Math.floor(Math.random() * arr.length)
            const element = arr.splice(index, 1)[0];

            elements.push(element)

            return getRandomElement(arr)
        } else {
            return elements
        }
    }

    return getRandomElement([...array])
}
1 голос
/ 17 декабря 2017

Простая функция:

var myArray = ['January', 'February', 'March'];
function random(array) {
     return array[Math.floor(Math.random() * array.length)]
}
random(myArray);

OR

var myArray = ['January', 'February', 'March'];
function random() {
     return myArray[Math.floor(Math.random() * myArray.length)]
}
random();

OR

var myArray = ['January', 'February', 'March'];
function random() {
     return myArray[Math.floor(Math.random() * myArray.length)]
}
random();
1 голос
/ 12 декабря 2017

Faker.js имеет множество вспомогательных функций для генерации случайных тестовых данных.Это хороший вариант в контексте набора тестов:

const Faker = require('faker');
Faker.random.arrayElement(['January', 'February', 'March']);

Как отмечали комментаторы, как правило, вам не следует использовать эту библиотеку в рабочем коде.

1 голос
/ 19 мая 2017

var item = myArray[Math.floor(Math.random()*myArray.length)];

или эквивалентная более короткая версия:

var item = myArray[(Math.random()*myArray.length)|0];

Пример кода:

var myArray = ['January', 'February', 'March'];    
var item = myArray[(Math.random()*myArray.length)|0];
console.log('item:', item);
1 голос
/ 02 января 2016

Это похоже, но более общее, чем решение @Jacob Relkin:

Это ES2015:

const randomChoice = arr => {
    const randIndex = Math.floor(Math.random() * arr.length);
    return arr[randIndex];
};

Код работает, выбирая случайное число от 0 до длины массива, затем возвращая элемент с этим индексом.

0 голосов
/ 13 мая 2014

По моему мнению, лучше, чем возиться с прототипами или объявлять их вовремя, я предпочитаю выставлять их в окно:

window.choice = function() {
  if (!this.length || this.length == 0) return;
  if (this.length == 1) return this[0];
  return this[Math.floor(Math.random()*this.length)];
}

Теперь в любом месте вашего приложения вы называете это как:

var rand = window.choice.call(array)

Таким образом, вы все еще можете правильно использовать for(x in array) loop

0 голосов
/ 07 апреля 2018

Эта работа для меня как обаяние без всяких повторений.

var Random_Value = Pick_Random_Value([1,3,7,9]);

function Pick_Random_Value(IN_Array,Return_Length,Last_Pick_Random_Key)
{
    Return_Length        = Return_Length || 1;
    Last_Pick_Random_Key = Last_Pick_Random_Key || 'Last_Pick_Random_Key';
    if(IN_Array != undefined && IN_Array.length > 0)
    {
        var Copy_IN_Array = JSON.parse(JSON.stringify(IN_Array)); // For disable array refrance
        if((typeof window[Last_Pick_Random_Key] !== 'undefined') && (window[Last_Pick_Random_Key] !== false))
        {
            var Last_Pick_Random = window[Last_Pick_Random_Key];
            if(Copy_IN_Array[Last_Pick_Random] != undefined)
            {
                Copy_IN_Array.splice(Last_Pick_Random,1);
            }
        }

        var Random_Values = [];
        var Return_Value  = false;
        if(Copy_IN_Array.length > 0)
        {
            if(Return_Length === 1)
            {
                var Random_Key = Math.floor(Math.random() * Copy_IN_Array.length);
                Return_Value = Copy_IN_Array[Random_Key];
            }
            else
            {
                if(Copy_IN_Array.length >= Return_Length)
                {
                    do {
                        Random_Values[Random_Values.length] = Copy_IN_Array.splice( Math.floor(Math.random() * Copy_IN_Array.length), 1)[0];
                    } while (Random_Values.length < Return_Length);
                    Return_Value = Random_Values;
                }
                else
                {
                    do {
                      Random_Values[Random_Values.length] = Copy_IN_Array.splice( Math.floor(Math.random() * Copy_IN_Array.length), 1)[0];
                    } while (Random_Values.length < Return_Length);
                    Return_Value = Random_Values;
                }
            }

        }
        else
        {
            Return_Value = IN_Array[0];
        }

        window[Last_Pick_Random_Key] = IN_Array.indexOf(Return_Value);
        if(window[Last_Pick_Random_Key] === -1)
        {
            for (var i = 0; i < IN_Array.length; i++)
            {
                if (JSON.stringify(IN_Array[i]) === JSON.stringify(Return_Value))
                {
                    window[Last_Pick_Random_Key] = i;
                    break;
                }
            }
        }

        return Return_Value;
    }
    else
    {
        return false;
    }
}
0 голосов
/ 15 марта 2018

static generateMonth() { 
const theDate = ['January', 'February', 'March']; 
const randomNumber = Math.floor(Math.random()*3);
return theDate[randomNumber];
};

Вы устанавливаете постоянную переменную для массива, затем у вас есть другая константа, которая выбирает случайным образом между тремя объектами в массиве, а затем функция просто возвращает результаты.

0 голосов
/ 11 октября 2018

Общий способ получения случайных элементов:

let some_array = ['Jan', 'Feb', 'Mar', 'Apr', 'May'];
let months = random_elems(some_array, 3);

console.log(months);

function random_elems(arr, count) {
  let len = arr.length;
  let lookup = {};
  let tmp = [];

  if (count > len)
    count = len;

  for (let i = 0; i < count; i++) {
    let index;
    do {
      index = ~~(Math.random() * len);
    } while (index in lookup);
    lookup[index] = null;
    tmp.push(arr[index]);
  }

  return tmp;
}
0 голосов
/ 28 апреля 2016

Я нашел способ обойти сложности верхнего ответа, просто конкатенируя переменную rand к другой переменной, которая позволяет отображать это число внутри вызова myArray [] ;.Удалив новый созданный массив и поиграв с его сложностями, я нашел рабочее решение:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>

var myArray = ['January', 'February', 'March', 'April', 'May'];    

var rand = Math.floor(Math.random() * myArray.length);

var concat = myArray[rand];

function random() {
   document.getElementById("demo").innerHTML = (concat);
}
</script>

<button onClick="random();">
Working Random Array generator
</button>

</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...