2017-02-13 54 views
1

我一直在玩新的ES6 Map(),只是为了习惯它,现在我们可以得到它的大小,我发现我可以有效地随机抽取一张地图,看看它是什么看起来像。能访问由ES6'Map'对象的keys()方法返回的数组吗?

很明显,可以遍历所有条目,然后选择随机样本。但是这对于大型地图来说并不吸引人。

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

但Map方法keys()返回一个迭代器对象,它的next()方法通常用于迭代Map实例。并且,它还包含所有条目的数组。这显示在Chrome Devtools输出的摘要如下:

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

... (entries omitted) 

length 
: 
7 

我找不到如何访问这个数组,以便找到由数组索引的条目。

下面的代码(给出get_random_integer()和report()...)的代码(相当毫无意义,但是是说明性的)。

函数play()在按钮按下时调用,并记录一个随机名称。

但是,最好不要迭代,只需要获取数组中给定位置的条目。

任何想法?

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); 
} 
+2

我不知道你的意思是“不能得到它”。 HTTP://计算器。com/questions/4550505 /从数组中获得随机值 –

+0

对不起,要求澄清,澄清。 –

回答

1

如果我正确理解你的问题,你只是想从一个Map对象中获得一个随机密钥。

,我能想到的来完成,这简单的方法是通过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));

+0

谢谢,很值得听到传播... –

-3

我同意上面的意见,如果您可以提供更多的上下文将是有帮助的。这就是说,如果你想遍历一个对象的键,你需要一个数组。要创建的按键阵列可以使用Object.keys()https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

const america = { 
    California: "Sacramento", 
    NewYork: "New York", 
    Texas: "Austin" 
} 

const capitals = (america) => { 
    let result = [] 
    for (var key in america) { 
    result.push(america[key]) 
    } 
    return result; 
} 
console.log(capitals(america)) 

const states = Object.keys(america) 
console.log(states); 
1

您可以使用传播元素转换MapArrayArray.prototype.entries()拿到钥匙,值对数组。

const map = new Map; 
 

 
map.set(2, {abc:123}); 
 
map.set(7, {def:456}); 
 
map.set(1, {ghi:789}); 
 

 
let entries = [...map]; 
 
let len = entries.length; 
 
let key = Math.floor(Math.random() * len); 
 
let [prop, value] = entries[key]; 
 

 
console.log(prop, value);