Изменить
arrayOfObjects = Array(120).fill({})
hexTiles = this.arrayOfObjects.map( (hex, index) => this.createHex(hex, index))
для этого
hexTiles = [...Array(120)].map((_, i) => this.createHex({}, i));
Вот рабочий фрагмент:
function createHex(hex, index) {
hex['id'] = index;
hex['x-coordinate'] = null;
hex['y-coordinate'] = null;
hex['mapped'] = false;
hex['terrain'] = '';
hex['details'] = '';
return hex;
}
const hexTiles = [...Array(120)].map((_, i) => createHex({}, i));
console.log(hexTiles);
Вот объяснение вашей проблемы.
function createHex(hex, index) {
hex['id'] = index;
hex['x-coordinate'] = null;
hex['y-coordinate'] = null;
hex['mapped'] = false;
hex['terrain'] = '';
hex['details'] = '';
return hex;
}
const obj = { };
const arrayOfObjects = Array(120).fill(obj);
const hexTilesBad = arrayOfObjects.map((hex, index) => createHex(hex, index));
console.log(obj)
При заполнении массива {} вы фактически заполняете его копиями ссылки на тот же объект.Это связано с тем, что по умолчанию в Javascript / Typescript при назначении объекта вы назначаете его ссылку.
В приведенном выше примере вместо заполнения массива {}
мы заполняем его obj
это просто {}
.Когда мы console.log(obj)
в конце, мы видим, что оно действительно имеет значение последней итерации.
Его ссылка была скопирована в массив 120 раз, и эти ссылки были переданы в map
,затем к вашей createHex
функции.Таким образом, в конечном счете, вы просто модифицируете 120 раз один и тот же объект.
Однако, когда вы передаете {}
непосредственно в createHex
из функции стрелки map
, новый объект создается для каждой итерации вобласть действия, поэтому ничего не передается.
EDIT: [...Array(120)]
, похоже, не работает в TypeScript.Как отмечает @ AJT_82 в комментариях ниже, это происходит из-за ошибки TypeScript , из-за которой этот трюк оператора распространения некорректно переводится в JavaScript.
Чтобы обойти проблему, вы можете попробоватьследующее:
Array.from({ length: 120 })
или придерживайтесь вашего метода
Array(120).fill({})
Важно не использовать содержимое этого массива, поскольку они являются просто ссылками на один и тот же объект.