Встроенные функции Screeps не возвращают ожидаемые типы

В игре Screeps у меня возникают некоторые проблемы с типами возврата некоторых встроенных функций. Возьмите следующий код:

var creeps1 = Game.creeps
var room = Game.rooms[myRoomName];
var creeps2 = room.find(FIND_CREEPS);

console.log(creeps1.constructor.name);
console.log(creeps1 instanceof Array);

console.log(creeps2.constructor.name);
console.log(creeps2 instanceof Array);

console.log([].constructor.name);
console.log([] instanceof Array);

Вы ожидаете, что все они будут массивами, и поэтому все они будут экземплярами Array, Тем не менее в мировой игре я получаю следующие результаты (с myRoomName установить имя комнаты, к которой у меня есть доступ):

// Results in world
[1:11:11 AM] Object
[1:11:11 AM] false
[1:11:11 AM] Array
[1:11:11 AM] false
[1:11:11 AM] Array
[1:11:11 AM] true

Но подождите, это становится страннее. Когда я запускаю тот же код в симуляции (на этот раз myRoomName является 'sim'), Я получаю следующие результаты:

// Results in simulation
[1:11:11 AM] Object
[1:11:11 AM] false
[1:11:11 AM] Array
[1:11:11 AM] true
[1:11:11 AM] Array
[1:11:11 AM] true

Почему не все эти функции возвращают экземпляры Array? Как там вообще разные версии Array в мировой среде? И есть ли способ превратить результаты в случаи Array?

1 ответ

Решение

Game.creeps не возвращает массив, он возвращает объект, который ведет себя как хеш, где имя крипа - это ключ, а крип - это значение. Это задокументировано в API для Game.creeps. Если вам нужно, чтобы это было в массиве, вы можете перебирать объект и добавлять записи в массив.

Что касается того, почему creeps2 instanceof отличается в симуляции от реальной игры, сказать сложно. Тем не менее, Array.isArray(creeps2), кажется, ведет себя согласованно между двумя средами (возвращает истину в обоих случаях).

Другие вопросы по тегам