2017-02-19 3 views
1

Angenommen, ich habe ein Objekt mit einer Tonne des Schlüssels:Gibt es eine konstante Zeitlösung, um einen zufälligen Schlüssel eines riesigen Objekts zu erhalten?

const myObject = { 
    "a": 1, 
    "b": 2, 
    "c": 3, 
    ... 
} 

ich eine separate Liste von Schlüsseln gespeichert habe, kann ich leicht einen gelegentliche in konstanter Zeit erhalten:

const keys = Object.keys(myObject); 
const rand = keys[(Math.random() * keys.length)|0]; 

, Darüber hinaus random element from stream ermöglicht es, einen solchen Schlüssel zu erhalten, ohne dass eine zusätzliche Struktur benötigt wird:

function pickRandomProperty(obj) { 
    var result; 
    var count = 0; 
    for (var prop in obj) 
     if (Math.random() < 1/++count) 
      result = prop; 
    return result; 
} 

Aber eine solche Lösung ist eher linear als konstante Zeit. Angesichts der neuen ES6-Spezifikationen frage ich mich, ob es jetzt einen Weg gibt, einen zufälligen Schlüssel in konstanter Zeit in Funktion von nur myObject zu bekommen?

+0

Was sind Ihre Zufälligkeitsanforderungen? Ist es genug, um die Eigenschaft zu erfüllen, dass auf lange Sicht jeder Schlüssel mehr oder weniger mit der gleichen Häufigkeit gewählt wurde? –

+0

in ein Array konvertieren? –

+0

@ HonzaRemes ja – MaiaVictor

Antwort

1

Nein, Ihre Entscheidungen sind nach wie vor im Wesentlichen die gleiche wie die, die Sie erwähnt haben:

  1. einen Array von Eigenschaftsnamen Get (mit variabler Länge Zeit) und dann zufällig Index in sie (konstante Zeit) oder

  2. Schleife (variable Zeit)

Es gibt keine grundlegend neue Sache für diese in ES2015 oder ES2016 (oder ES2017, kommen zu, dass).

Verwandte Themen