2012-01-24 9 views
3

辞書形式のオブジェクトが{a:1, b:-2, c:42}などのJavascriptで指定されている場合、プロパティをランダムに選択する簡単な方法はありますか?Javascriptでオブジェクトの列挙可能なプロパティをランダムに選択します。

上記の例では、ランダムにa,bまたはcを返す関数を用意したいと思います。

私が作ってみたソリューションは、次のようなものです:

var proplist = [] 
    forEach(property in foo) { 
     if(propertyIsEnumerable(foo[property]) { 
      proplist.push(property); 
     } 
    } 
    var n = proplist.length; 
    // randomly choose property (randInt(n) returns a random integer in [0,n)) 
    proplist[randInt(n)]; 

これを行うにはより多くの慣用的な方法はありますか?

+0

[Javascriptオブジェクトのランダムプロパティを選択]の複製可能です。(http://stackoverflow.com/questions/2532218/pick-random-property-from-a-javascript-object) – Gazler

答えて

7

Object.keys(またはさらにはObject.getOwnPropertyNames)を使用してすべてのプロパティのリストを取得します。次に、Math.random()にリストの長さflooredを乗算してランダムプロパティを選択します。

var propList = {}; //... 
var tmpList = Object.keys(propList); 
var randomPropertyName = tmpList[ Math.floor(Math.random()*tmpList.length) ]; 
var propertyValue = propList[randomPropertyName]; 
+0

'Object.keys'メソッドまさに私が探していたものです、ありがとう! – tlehman

5

これはunderscore.jsとかなり慣用ことができます。

randomProp = _.shuffle(_.keys(obj))[0] 

編集:実際には、人はそのための_.sampleを使用する必要があります。

+0

私はアンダースコアを聞いたことがありません.js、それはかなりクールに見えます! – tlehman

+0

もちろん、キーのリスト全体をシャッフルします。おそらく 'n - 1'を' random'に呼び出します。 'n'は' keys'の長さです。もう1つの答えと質問に示されているように、これはただ1つの 'random'呼び出しで行うことができます。 –

+0

@ScottSauyet:もちろん、これは間違った答えです。編集しました。 – georg

2

それとも、このための再利用可能な機能を書きたい場合、あなたはあなたのオブジェクトにプロパティがありませんが、それはおそらく、我々はどのような場合に行うことができる最高だ場合、これはundefinedを返します

const randomFrom = list => list[Math.floor(list.length * Math.random())]; 
const randomProp = obj => randomFrom(Object.keys(obj)); 

randomProp(propList); //=> one of the keys of propList 

行うことができます。

関連する問題