Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Как лучше хранить entity?

#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

Комментариев нет:

Отправить комментарий