【问题标题】:Get a random element from a hash in JavaScript从 JavaScript 中的哈希中获取随机元素
【发布时间】:2013-10-28 11:30:01
【问题描述】:

我在 JavaScript 中有一个哈希表:

a['b'] = 'c';
a['d'] = 'e';

我知道我可以使用a.length 获取我的哈希长度。如何在哈希中获取随机元素?我不知道如何或是否可以像数组一样索引它。

我知道我可以创建一个单独的哈希键数组,但我想让这更容易,并且只处理 1 个哈希。

【问题讨论】:

    标签: javascript hash hashmap hashtable associative-array


    【解决方案1】:

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

    你可以像Object.keys(a)一样简单地从对象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 另一种可能的方法是循环 for(in) 随机次数,介于 1 和对象中的键数之间,但它是等效的 O(N) 解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 2016-04-23
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多