Considerar:
var myArray = ['January', 'February', 'March'];
Como posso selecionar um valor aleatório dessa matriz usando JavaScript?
javascript
Sarah
fonte
fonte
Math.floor(Math.random(...))
chamada, que arredonda para baixo.var rand = myArray[Math.random() * myArray.length>>0]
de ser um pouco mais rápidovar rand = myArray[Math.random() * myArray.length | 0]
Se você já possui sublinhado ou lodash incluído no seu projeto, pode usar
_.sample
.Se você precisar obter mais de um item aleatoriamente, poderá passar isso como um segundo argumento em sublinhado:
ou use o
_.sampleSize
método no lodash:fonte
Método de protótipo
Se você planeja obter muito um valor aleatório, pode definir uma função para ele.
Primeiro, coloque isso no seu código em algum lugar:
Agora:
Código liberado para o domínio público sob os termos da licença CC0 1.0 .
fonte
.sample()
em qualquer matriz para obter um item aleatório~~
é muito mais rápido queMath.Floor()
, portanto, quando se trata de otimização de desempenho enquanto produz saída usando elementos da interface do usuário,~~
vence o jogo. MAIS INFORMAÇÕESMas se você souber que a matriz terá milhões de elementos, poderá reconsiderar entre o Bitwise Operator e
Math.Floor()
, como o operador bit a bit se comporta estranhamente com grandes números. Veja o exemplo abaixo explicado com a saída. MAIS INFORMAÇÕESfonte
Math.floor
agora :)Digamos que você queira escolher um item aleatório diferente da última vez (não muito aleatório, mas ainda um requisito comum) ...
Com base na resposta de @Markus, podemos adicionar outra função de protótipo:
E implemente da seguinte maneira:
fonte
Se você tiver valores fixos (como a lista de nomes do mês) e quiser uma solução de uma linha
A segunda parte da matriz é uma operação de acesso, conforme descrito em Por que [5,6,8,7] [1,2] = 8 em JavaScript?
fonte
A versão mais curta:
fonte
| 0
faz?| 0
si é uma operação bit a bit que não faz nada, mas no javascript os flutuadores são convertidos em ints antes de qualquer operação bit a bit . Portanto, é algo como+ ''
realmente não faz nada, mas pode ser usado para converter coisas em strings.Math.floor
mas é a coisa correta a ser feita aqui. É um operador, por isso é mais rápido doMath.floor
que apenas porque a qualquer momento durante a execução de algum código pode fazerMath.floor = someOtherFunction
e eles não podem fazer o mesmo para '|'. Por outro lado, como paraMath.floor
e|
ser diferente tentativaMath.floor(-1.5)
vs-1.5 | 0
. A propósito, você não precisa dos parênteses.|
tem uma precedência muito baixa.Se você deseja escrevê-lo em uma linha, como a solução de Pascual, outra solução seria escrevê-lo usando a função find do ES6 (com base no fato de que a probabilidade de selecionar aleatoriamente um dos
n
itens é1/n
):Use essa abordagem para fins de teste e se houver um bom motivo para não salvar a matriz apenas em uma variável separada. Caso contrário, as outras respostas (
floor(random()*length
e usando uma função separada) são o seu caminho.fonte
O Faker.js possui muitas funções utilitárias para gerar dados de teste aleatórios. É uma boa opção no contexto de um conjunto de testes:
Como os comentaristas mencionaram, geralmente você não deve usar esta biblioteca no código de produção.
fonte
Faker
qual seleciona um elemento de matriz aleatória.A edição do protótipo da matriz pode ser prejudicial. Aqui está uma função simples de fazer o trabalho.
Uso:
fonte
Função autônoma recursiva que pode retornar qualquer número de itens (idêntico ao lodash.sampleSize ):
fonte
Para obter uma matriz de formulários aleatórios de itens com criptografia forte, use
fonte
Isso é semelhante, mas mais genérico, à solução de @Jacob Relkin:
Este é o ES2015:
O código funciona selecionando um número aleatório entre 0 e o comprimento da matriz, retornando o item nesse índice.
fonte
var item = myArray[Math.floor(Math.random()*myArray.length)];
ou versão mais curta equivalente:
var item = myArray[(Math.random()*myArray.length)|0];
Código de amostra:
fonte
Função simples:
OU
OU
fonte
Na minha opinião, melhor do que mexer com protótipos ou declará-lo bem a tempo, prefiro expô-lo à janela:
Agora em qualquer lugar do seu aplicativo, você chama assim:
Dessa forma, você ainda pode usar o
for(x in array)
loop corretamentefonte
for...in
matrizes ou mesmo em geral. Você corre o risco de percorrer a cadeia de protótipos. Também é destinado a todas as propriedades de um objeto, nem todos os índices em uma matriz. Se você deseja usar um iterador em uma matriz, usefor (var i = 0; i < foo.length; i++){}
. Melhor ainda, use algo como issoArray.prototype.forEach
.Eu encontrei uma maneira de contornar as complicações da resposta principal, apenas concatenando a variável rand para outra variável que permite que esse número seja exibido dentro da chamada de myArray [] ;. Ao excluir a nova matriz criada e brincar com suas complicações, criei uma solução funcional:
fonte
concat
está sempre mudando aqui ...random
em si não está mudando isso, e nada mais está sendo chamado mais de uma vez ....Você define uma variável constante para a matriz, em seguida, tem outra constante que escolhe aleatoriamente entre os três objetos na matriz e a função simplesmente retorna os resultados.
fonte
Uma maneira genérica de obter elementos aleatórios:
fonte
O randojs torna isso um pouco mais simples e legível:
fonte
Aqui está um exemplo de como fazê-lo:
fonte
outro método fácil:
fonte
Crie um valor aleatório e passe para a matriz
Por favor, tente o seguinte código ..
fonte