Действительно, порядок ключей в простых объектах, посещаемых при их итерации, не гарантируется порядком вставки.В частности, значения, которые (при преобразовании в числа) являются положительными целыми числами в 32-битном диапазоне, посещаются в числовом порядке.
Массивы являются альтернативой, поскольку они четко поддерживают порядок вставки при использовании push
.Недостатком является то, что они не предлагают поведение словаря, поэтому вы можете найти запись по (оригинальному) ключу.
Если вам действительно нужно поведение словаря и, в то же время, порядок вставки, тогда Map
может быть решением:
var lastClicked;
var map = new Map; // <---
var grid = clickableGrid(20, 30, function(el, row, col, i, isDoubleClick) {
if (!isDoubleClick && !el.className) {
el.className = "clicked";
map.set(i, 0);
} else if (isDoubleClick && !el.className) {
el.className = "niclicked";
map.set(i, 1);
}
map.forEach((value, key) => console.log(key, value)); //<-- insertion order!
});
document.body.appendChild(grid);
Вы можете использовать: map.get(key)
, чтобы получить значение 0/1 для данного ключа в постоянное время, как если бы вы использовали обычный объект.