Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可以访问ES6';的keys()方法返回的数组吗;地图';对象_Javascript_Dictionary - Fatal编程技术网

Javascript 可以访问ES6';的keys()方法返回的数组吗;地图';对象

Javascript 可以访问ES6';的keys()方法返回的数组吗;地图';对象,javascript,dictionary,Javascript,Dictionary,我一直在玩新的ES6 Map(),只是为了适应它,现在我们可以得到它的大小了,我突然想到可以有效地对地图进行随机采样,看看它是什么样子 很明显,可以遍历所有条目,生成一个数组,然后选择随机样本。但这对于大型地图来说并不吸引人 最后有一些代码通过利用新可用的地图大小来实现这一点。它的效率略高于复制,但仍然没有吸引力 但是Map方法keys()返回一个迭代器对象,我们通常使用它的next()方法在Map实例上进行迭代。而且,它还包括一个包含所有条目的数组。这显示在Chrome Devtools输出的

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

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

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

但是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);
}

我同意上面的评论,如果你能提供更多的背景,这将是有益的。也就是说,如果您想要遍历对象的键,那么您需要一个数组。要创建键数组,可以使用Object.keys()


[[Entries]]
是迭代器的不可访问项。这是一个实现细节,甚至没有被指定。你无法理解它。

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

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

const-map=[['a','1',['b','2',['c','3']];
const getRandKey=map=>[…map.keys()][Math.floor(Math.random()*1000)%map.size];

设i=10;而(i-->0)console.log(getRandKey(map))
您可以使用扩展元素将
Map
转换为
Array
Array.prototype.entries()
以获取键、值对数组

const map=新映射;
map.set(2,{abc:123});
map.set(7,{def:456});
map.set(1,{ghi:789});
让条目=[…映射];
设len=entries.length;
让key=Math.floor(Math.random()*len);
让[prop,value]=条目[key];

控制台日志(道具、值)我不知道你说的“无法到达”是什么意思。抱歉,不清楚,请按要求澄清。
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);