Я играл с новой ES6 Map(), просто чтобы привыкнуть к ней, и теперь мы можем получить размер, мне пришло в голову, что можно эффективно брать случайные образцы карты, чтобы увидеть, что это выглядит как.Можно ли получить доступ к массиву, возвращаемому методом keys() объекта ES6 «Карта»?
Очевидно, что можно выполнить итерацию, сделать массив всех записей, а затем выбрать случайные образцы. Но это непривлекательно для больших карт.
В конце есть некоторый код, который достигает этого, используя новый доступный размер карты. Это немного более эффективно, чем копирование, но все же непривлекательно.
Но ключи метода Map() возвращают объект-итератор, метод 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);
}
Я не уверен, что вы подразумеваете под «не может добраться до него». Http: // StackOverflow.com/questions/4550505/get-random-value-from-a-array –
Извините, что не ясно, уточняется по вашему запросу. –