1268 Stimmen

Abrufen eines Zufallswertes aus einem JavaScript-Array

Bedenken Sie:

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

Wie kann ich mit JavaScript einen Zufallswert aus diesem Array auswählen?

23voto

CrazyTim Punkte 5899

Angenommen, Sie möchten einen zufälligen Gegenstand auswählen, der sich vom letzten Mal unterscheidet (nicht wirklich zufällig, aber dennoch eine häufige Anforderung)...

/**
 * Return a random element from an array that is
 * different than `last` (as long as the array has > 1 items). 
 * Return null if the array is empty.
*/
function getRandomDifferent(arr, last = undefined) {
  if (arr.length === 0) {
    return null;
  } else if (arr.length === 1) {
    return arr[0];
  } else {
    let num = 0;
    do {
      num = Math.floor(Math.random() * arr.length);
    } while (arr[num] === last);
    return arr[num];
  }
}

So umsetzen:

const arr = [1,2,3];
const r1 = getRandomDifferent(arr);
const r2 = getRandomDifferent(arr, r1); // r2 is different than r1.

16voto

Tony O'Hagan Punkte 20160

Viele der angebotenen Lösungen fügen eine Methode zu einem bestimmten Array hinzu, die die Verwendung auf dieses Array beschränkt. Diese Lösung ist wiederverwendbarer Code, der für jedes Array funktioniert und typsicher gemacht werden kann.

TypScript

export function randChoice<T>(arr: Array<T>): T {
  return arr[Math.floor(Math.random() * arr.length)]
}

JavaScript

export function randChoice(arr) {
  return arr[Math.floor(Math.random() * arr.length)]
}

13voto

I.G. Pascual Punkte 5430

Wenn Sie feste Werte haben (wie eine Liste mit Monatsnamen) und eine einzeilige Lösung wünschen

var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]

Der zweite Teil des Arrays ist eine Zugriffsoperation, wie sie in Warum ist [5,6,8,7][1,2] = 8 in JavaScript?

13voto

Stephan Punkte 1838

Wenn Sie es in eine Zeile schreiben wollen, wie bei Pascuals Lösung, wäre eine andere Lösung, es mit der Find-Funktion von ES6 zu schreiben (basierend auf der Tatsache, dass die Wahrscheinlichkeit der zufälligen Auswahl eines aus den n Artikel ist 1/n ):

var item = ['A', 'B', 'C', 'D'].find((_, i, ar) => Math.random() < 1 / (ar.length - i));
console.log(item);

Verwenden Sie diesen Ansatz nur zu Testzwecken und wenn es einen guten Grund gibt, das Array nicht in einer separaten Variablen zu speichern. Ansonsten sind die anderen Antworten ( floor(random()*length und die Verwendung einer separaten Funktion) sind der richtige Weg.

9voto

Nathan Punkte 5160

Faker.js hat viele nützliche Funktionen zur Erzeugung von zufälligen Testdaten. Es ist eine gute Option im Zusammenhang mit einer Testsuite:

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

Wie in den Kommentaren erwähnt, sollten Sie diese Bibliothek im Allgemeinen nicht in Produktionscode verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X