当前位置: 首页 > 知识库问答 >
问题:

可以访问ES6'map'对象的keys()方法返回的数组吗?

东门清夷
2023-03-14

我一直在玩新的ES6地图(),只是为了适应它,现在我们可以得到大小了,我突然想到可以有效地随机抽取地图样本,看看它是什么样子的。

显然,可以迭代遍历,将所有条目组成一个数组,然后选择随机样本。但这对大地图来说没有吸引力。

最后有一些代码通过利用地图的新可用大小来实现这一点。它比复制的效率稍高,但仍然没有吸引力。

但是Map方法keys()返回一个迭代器对象,我们通常使用它的next()方法来迭代Map实例。并且,它还包括所有条目的数组。下面的Chrome Devtools输出摘要显示了这一点:

coinNames.keys()
MapIterator
"keys"
....
[[Entries]]
:
Array[7]
0
:
30
1
:
12

... (entries omitted)

length
:
7

有什么想法吗?

function CoinName(name, slang, plural) {
    this.name = name;
    this.plural = plural;
}
const coinNames = new Map();

window.onload = init;
function init() {
    report ('OK');
    var button = document.getElementById('buttonA');
    button.addEventListener('click', play);

    coinNames.set(30, new CoinName('half crown'));
    coinNames.set(12, new CoinName('shilling', 'bob'));
    coinNames.set(3, new CoinName('threepenny bit'));
    coinNames.set(6, new CoinName('sixpence', 'tanner'));
    coinNames.set(1, new CoinName('penny', '', 'pence'));
    coinNames.set(1/4, new CoinName('farthing'));
    coinNames.set(1/2, new CoinName('halfpenny', 'hapeny',
                            'halfpence'));
}

function getRandomKey() {
    let requiredIndex = get_random_integer(0, coinNames.size);

    let keys = coinNames.keys();
    let found = undefined;
    let goon = true;
    let i = 0;
    while(goon) {
        goon = keys.next().value;
        //report(goon);
        if(goon && i===requiredIndex) {
            found = goon;
            goon = false;
        }
        i += 1;      
    }
    return found;
}

function play() {
    let key = getRandomKey();
    let entry = coinNames.get(key);
    report(entry.name);
}

共有1个答案

袁鸿畴
2023-03-14

如果我正确理解你的问题,你只是想从一个地图对象中得到一个随机键。

我能想到的最简单的方法是将map#keys返回的迭代器对象强制转换为数组(使用扩展运算符...array.from),然后简单地访问一个随机索引

const map = [['a','1'],['b','2'],['c','3']].reduce((m, e) => m.set(...e), new Map());
const getRandKey = map => [...map.keys()][Math.floor(Math.random() * 1000) % map.size];
let i = 10; while(i-- > 0) console.log(getRandKey(map));
 类似资料:
  • 我有一个对象数组: 寻找一个简单的一行返回: 因此,我可以很容易地泵到一个反应下拉与适当的键。 我觉得这个简单的解决方案应该可以工作,但是我得到了无效的语法错误:

  • 我的业务规则是,如果第一个、最后一个和中间字段都相等,或者如果第一个和最后一个字段相等,并且其中一个(或两个)对象的中间字段为null,则两个Name对象被视为相等。 因此,在为我的Name类实现hash和equals方法时,我可以使用这样的用例:equals为两个对象返回true,但这两个对象的hash返回不同的值(因为一个对象的middle值为null值,而另一个对象的middle值为null

  • 我从API获取数据。我正在使用API调用构建一个由5个对象组成的数组。我想做的是迭代数组,使用每个数组索引中的数据来构建一个组件,并将道具传递给另一个组件。 我尝试过以通常的方式访问该元素:img={pokemon.name},但它始终返回未定义。当我输入控制台时。log(pokemon)我获取存储在对象数组中的单个pokemon。 应该发生的是,当我映射pokemonArr时,我想通过执行 在r

  • 我有一个包含通过构造函数创建的对象的hashmap。这些对象在hashmap中 我有一个比较两个数组的函数。一个数组是手动创建的,但第二个数组是通过一个方法创建的。我只需要来自HashMap的值。 我被这种方法困住了... 如果取出.toArray(),将得到一个“无法从集合 转换为brick” 如果将.toArray()更改为.toString(),则会得到一个“无法从String转换为bric

  • 问题内容: 我在带有标志的Windows上使用 节点v0.11.14-nightly-20140819-pre。 我的JavaScript对象在其原型中定义了两种方法: 的对象返回一个承诺。 当我使用如下对象时: 在对象的结束时,由被称为一旦承诺得到满足。 我尝试同时使用 ES6 和 Bluebird promise实现。 为什么最终会出现这种情况? 问题答案: 为什么最终会出现这种情况? 因为您

  • 本文向大家介绍Java访问WebService返回XML数据的方法,包括了Java访问WebService返回XML数据的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java访问WebService返回XML数据的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的java程序设计有所帮助。