从JavaScript中的哈希中获取随机元素

从JavaScript中的哈希中获取随机元素,javascript,hash,hashmap,hashtable,associative-array,Javascript,Hash,Hashmap,Hashtable,Associative Array,我有一个JavaScript哈希表: a['b'] = 'c'; a['d'] = 'e'; 我知道我可以通过a.length获得哈希的长度。如何获得散列中的随机元素?我不知道如何或者是否可以像数组一样对它进行索引 我知道我可以创建一个单独的散列键数组,但我想让它简单得多,只处理1个散列。据我所知,JavaScript中并没有散列表或关联数组这样的概念。在JS中,这个东西叫做对象。看看你的sintaxa['b']='c',我可以断定a是一个对象(顺便说一句,对象不像数组那样具有“神奇的”len

我有一个JavaScript哈希表:

a['b'] = 'c';
a['d'] = 'e';
我知道我可以通过
a.length
获得哈希的长度。如何获得散列中的随机元素?我不知道如何或者是否可以像数组一样对它进行索引


我知道我可以创建一个单独的散列键数组,但我想让它简单得多,只处理1个散列。

据我所知,JavaScript中并没有散列表或关联数组这样的概念。在JS中,这个东西叫做对象。看看你的sintax
a['b']='c'
,我可以断定
a
是一个对象(顺便说一句,对象不像数组那样具有“神奇的”
length
属性)

您可以从对象
a
获取键数组(属性名),其简单程度与
object.keys(a)
一样,所以完整的解决方案如下

function randomValueOf( obj ) {
    var keys = Object.keys(obj);
    var len = keys.length;
    var rnd = Math.floor(Math.random()*len);
    var key = keys[rnd];
    return obj[key];
}

据我所知,JavaScript中没有哈希表或关联数组这样的概念。在JS中,这个东西叫做对象。看看你的sintax
a['b']='c'
,我可以断定
a
是一个对象(顺便说一句,对象不像数组那样具有“神奇的”
length
属性)

您可以从对象
a
获取键数组(属性名),其简单程度与
object.keys(a)
一样,所以完整的解决方案如下

function randomValueOf( obj ) {
    var keys = Object.keys(obj);
    var len = keys.length;
    var rnd = Math.floor(Math.random()*len);
    var key = keys[rnd];
    return obj[key];
}

从一个对象获取所有的键来设置一个随机值是远远不够的。@user2445942是的,它似乎不是O(1)效率(但实际上可以,如果object.keys的内部实现足够聪明的话-不是简单的基于拷贝的)。尽管如此,我认为这是最佳的——对于所介绍的语言和任务来说,这是可能的最佳解决方案。因为无法通过对象成员的编号来寻址对象成员,或者在一般情况下(不引用相同的object.keys)无法从对象键集中猜出正确的字符串@user2445942另一种可能的方法是在对象中的1和键数之间随机循环(in)次,但它等效于O(N)解决方案。从一个对象获取所有键来设置一个随机值远远不够有效。@user2445942是的,它似乎没有O(1)的效率(但实际上可以,如果object.keys的内部实现足够聪明,而不是简单的基于副本的实现)。尽管如此,我认为这是最佳的——对于所介绍的语言和任务来说,这是可能的最佳解决方案。因为在一般情况下(不引用同一个object.keys)@user2445942无法通过对象成员的编号来寻址对象成员,或者从对象键集中猜出正确的字符串,所以另一种可能的方法是在对象中的1和键数之间随机循环(in)次,但这相当于O(N)解。