fix(Objectmap): switch to an object map with unique keys

This commit is contained in:
2020-02-06 15:31:58 +00:00
parent 9d756dbff7
commit b880036b64
6 changed files with 145 additions and 50 deletions

View File

@@ -1,11 +1,41 @@
import * as plugins from './lik.plugins';
/**
* fast map allows for very quick lookups of objects with a unique key
*/
export class FastMap<T> {
private mapObject: { [key: string]: T } = {};
public isUniqueKey() {}
public isUniqueKey(keyArg: string): boolean {
return this.mapObject[keyArg] ? false : true;
}
public addToMap(identifier: string, objectArg: T) {
this.mapObject[identifier] = objectArg;
public addToMap(keyArg: string, objectArg: T): boolean {
if (this.isUniqueKey(keyArg)) {
this.mapObject[keyArg] = objectArg;
return true;
} else {
return false;
}
}
public getByKey(keyArg: string) {
return this.mapObject[keyArg];
}
public removeFromMap(keyArg): T {
const removedItem = this.getByKey(keyArg);
delete this.mapObject[keyArg];
return removedItem;
}
public getKeys() {
const keys: string[] = [];
for (const keyArg in this.mapObject) {
if (this.mapObject[keyArg]) {
keys.push(keyArg);
}
}
return keys;
}
}

View File

@@ -12,7 +12,12 @@ export class LoopTracker<T> {
* checks and tracks an object
* @param objectArg
*/
checkAndTrack(objectArg: T) {
return this.referenceObjectMap.add(objectArg);
checkAndTrack(objectArg: T): boolean {
if (!this.referenceObjectMap.checkForObject(objectArg)) {
this.referenceObjectMap.add(objectArg);
return true;
} else {
return false;
}
}
}

View File

@@ -14,7 +14,6 @@ export interface IObjectmapFindFunction<T> {
*/
export class Objectmap<T> {
private fastMap = new FastMap<T>();
private objectArray: T[] = [];
// events
public eventSubject = new plugins.smartrx.rxjs.Subject<any>();
@@ -30,45 +29,51 @@ export class Objectmap<T> {
* adds an object mapped to a string
* the string must be unique
*/
addMappedUnique(uniqueKey: string, objectArg: T) {
this.add(objectArg);
this.fastMap.addToMap(uniqueKey, objectArg);
addMappedUnique(uniqueKeyArg: string, objectArg: T) {
this.fastMap.addToMap(uniqueKeyArg, objectArg);
}
/**
* fastest way to get an object from the map
* @param uniqueKey
*/
public getMappedUnique(uniqueKey: string) {}
public getMappedUnique(uniqueKeyArg: string) {
return this.fastMap.getByKey(uniqueKeyArg);
}
/**
* remove key
* @param functionArg
*/
public removeMappedUnique() {}
public removeMappedUnique(uniqueKey: string) {
const object = this.getMappedUnique(uniqueKey);
}
/**
* add object to Objectmap
* returns false if the object is already in the map
* returns true if the object was added successfully
*/
public add(objectArg: T): boolean {
if (this.checkForObject(objectArg)) {
// the object is already in the objectmap
return false;
} else {
// the object is not yet in the objectmap
this.objectArray.push(objectArg);
this.eventSubject.next('add');
return true;
public add(objectArg: T): string {
// lets search for an existing unique key
for (const keyArg of this.fastMap.getKeys()) {
const object = this.fastMap.getByKey(keyArg);
if (object === objectArg) {
return keyArg;
}
}
// otherwise lets create it
const uniqueKey = plugins.smartunique.shortId();
this.addMappedUnique(uniqueKey, objectArg);
return uniqueKey;
}
/**
* like .add but adds an whole array of objects
*/
public addArray(objectArrayArg: T[]) {
for (let item of objectArrayArg) {
for (const item of objectArrayArg) {
this.add(item);
}
}
@@ -76,19 +81,34 @@ export class Objectmap<T> {
/**
* check if object is in Objectmap
*/
public checkForObject(objectArg: T) {
return this.objectArray.indexOf(objectArg) !== -1;
public checkForObject(objectArg: T): boolean {
return !!this.getKeyForObject(objectArg);
}
/**
* get key for object
* @param findFunction
*/
public getKeyForObject(objectArg: T) {
let foundKey: string = null;
for (const keyArg of this.fastMap.getKeys()) {
if (!foundKey && this.fastMap.getByKey(keyArg) === objectArg) {
foundKey = keyArg;
} else {
continue;
}
}
return foundKey;
}
/**
* find object
*/
public find(findFunction: IObjectmapFindFunction<T>) {
const resultArray = this.objectArray.filter(findFunction);
if (resultArray.length > 0) {
return resultArray[0];
} else {
return null;
public find(findFunction: IObjectmapFindFunction<T>): T {
for (const keyArg of this.fastMap.getKeys()) {
if (findFunction(this.fastMap.getByKey(keyArg))) {
return this.getMappedUnique(keyArg);
}
}
}
@@ -107,8 +127,8 @@ export class Objectmap<T> {
* run function for each item in Objectmap
*/
public async forEach(functionArg: IObjectmapForEachFunction<T>) {
for (let object of this.objectArray) {
await functionArg(object);
for (const keyArg of this.fastMap.getKeys()) {
await functionArg(this.fastMap.getByKey(keyArg));
}
}
@@ -116,7 +136,9 @@ export class Objectmap<T> {
* gets an object in the Observablemap and removes it, so it can't be retrieved again
*/
public getOneAndRemove(): T {
const removedItem = this.objectArray.shift();
const keys = this.fastMap.getKeys();
const keyToUse = keys[keys.length - 1];
const removedItem = this.fastMap.removeFromMap(keyToUse);
this.eventSubject.next('remove');
return removedItem;
}
@@ -126,8 +148,8 @@ export class Objectmap<T> {
*/
public getArray(): T[] {
const returnArray: any[] = [];
for (const objectItem of this.objectArray) {
returnArray.push(objectItem);
for (const keyArg of this.fastMap.getKeys()) {
returnArray.push(this.fastMap.getByKey(keyArg));
}
return returnArray;
}
@@ -136,32 +158,29 @@ export class Objectmap<T> {
* check if Objectmap ist empty
*/
public isEmpty(): boolean {
if (this.objectArray.length === 0) {
return true;
} else {
return false;
}
return this.fastMap.getKeys().length === 0;
}
/**
* remove object from Objectmap
*/
public remove(objectArg: T) {
let replacementArray = [];
for (let item of this.objectArray) {
if (item !== objectArg) {
replacementArray.push(item);
}
public remove(objectArg: T): T {
if (this.checkForObject(objectArg)) {
const keyArg = this.getKeyForObject(objectArg);
const removedObject = this.fastMap.removeFromMap(keyArg);
this.eventSubject.next('remove');
return removedObject;
}
this.objectArray = replacementArray;
this.eventSubject.next('remove');
return null;
}
/**
* wipe Objectmap
*/
public wipe() {
this.objectArray = [];
this.eventSubject.next('wiped');
for (const keyArg of this.fastMap.getKeys()) {
this.fastMap.removeFromMap(keyArg);
}
}
}

View File

@@ -13,8 +13,9 @@ import * as smartdelay from '@pushrocks/smartdelay';
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartrx from '@pushrocks/smartrx';
import * as smarttime from '@pushrocks/smarttime';
import * as smartunique from '@pushrocks/smartunique';
export { smartdelay, smartpromise, smartrx, smarttime };
export { smartdelay, smartpromise, smartrx, smarttime, smartunique };
// ==============
// third party