作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用对象数组的项目,我正在考虑将其迁移到 es6 Sets 或 Maps。
我需要快速从它们中获取一个随机项目(对于我当前的数组来说显然微不足道)。我该怎么做?
最佳答案
map 和集合不太适合随机访问。它们是有序的并且长度已知,但它们没有通过顺序索引进行索引以供访问。因此,要获取 Map 或 Set 中的第 N 个项目,您必须迭代它才能找到该项目。
从集合或映射中获取随机项目的简单方法是获取键/项目的整个列表,然后选择一个随机项目。
// get random item from a Set
function getRandomItem(set) {
let items = Array.from(set);
return items[Math.floor(Math.random() * items.length)];
}
<小时/>
您可以制作一个同时适用于 Set 和 Map 的版本,如下所示:
// returns random key from Set or Map
function getRandomKey(collection) {
let keys = Array.from(collection.keys());
return keys[Math.floor(Math.random() * keys.length)];
}
这显然不适用于大型 Set 或 Map,因为它必须迭代所有键并构建一个临时数组才能选择一个随机键。
<小时/>由于 Map 和 Set 都有已知的大小,因此您还可以纯粹根据 .size
属性选择随机索引,然后您可以迭代 Map 或 Set,直到达到所需的第 N 项。对于大型集合,这可能会更快一些,并且可以避免以更多代码为代价创建临时键数组,尽管平均而言它仍然与集合的 size/2 成比例。
// returns random key from Set or Map
function getRandomKey(collection) {
let index = Math.floor(Math.random() * collection.size);
let cntr = 0;
for (let key of collection.keys()) {
if (cntr++ === index) {
return key;
}
}
}
关于dictionary - 如何从 es6 Map 或 Set 中获取随机项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42739256/
我是一名优秀的程序员,十分优秀!