#javascript #typescript
В общем первый подход был такой public entities: Entities.GameEntity[] = []; public players: Entities.PlayerEntity[] = []; Когда мне нужно найти entity делаю так public findPlayer(playerId: string) { let playerFounded: Entities.PlayerEntity = null; this.players.forEach((player: Entities.PlayerEntity)=> { if (player.client.socketId == playerId) { playerFounded = player; } }); return playerFounded; } Второй подход был такой public entities: any = {}; public ids: number[] = []; Добавление entityParams[0] - id of number this.entities[entityParams[0]] = entity; this.ids.push(Number(entityParams[0])); Обход всех this.ids.forEach((entityId)=> { this.entities[entityId] }); ну и если нужно быстро достать то this.entities[entityId] Как можно более лучше делать такие вещи, и какой из этих подходов лучше
Ответы
Ответ 1
Подобную задачу решал создавая специальный класс коллекцию Collection Вспомогательный интерфейс IKey interface IKey { key: string; } Интерфейс коллекции interface ICollection{ add(value: T); get(key: string): T; remove(key: string); } И сама реализация. Индекс элемента в массиве храним в хэше, поэтому не нужно делать полный перебор массива. class Collection implements ICollection { private array: T[] = []; private keyToIndex: {[key: string]: number} = {}; add(value: T) { this.array.push(value); this.keyToIndex[value.key] = this.array.length - 1; } get(key: string): T { return this.array[this.keyToIndex[key]]; } remove(key: string) { this.array.splice(this.keyToIndex[key], 1); delete this.keyToIndex[key]; } } Ответ 2
Если объем данных который будет храниться в массиве небольшой, то может выбирать любой вариант. А вот если данных будет большие, то будут проблемы с производительностью. Я разрабатываю приложения для мобильных устройств (cordova), так вот там у меня возникли эти проблемы (массив был около 1500 элементов). И чтобы решить их мы придумали вот такую хитрость: // recordKeyName {string} первичный ключ // record {any} элемент // records {any[]} массив для обработки setMapping: function (recordKeyName, record, records) { if (!records['maps']) { records['maps'] = {}; records.getRecordByKey = function (link) { return records.maps[link]; }; } records['maps'][record[recordKeyName]] = record; } // индексирование массива for (var i = 0; i <= items.length - 1; i++) { this.setMapping('LINK', items[i], items); } В дополнение к этому мы еще индексируем дополнительные поля, чтобы фильтрация происходила быстрей (в примере этого нет) В итоге получилось так, что при обычном просмотре массива время уходило примерно ~33 мс, а через индексы ~0,08
Комментариев нет:
Отправить комментарий