@blueworld/dictionarray

An indexed array for fast data access

Usage no npm install needed!

<script type="module">
  import blueworldDictionarray from 'https://cdn.skypack.dev/@blueworld/dictionarray';
</script>

README

📒 DictionArray

An indexed array for fast data access

Installation

Simply install the module via NPM:

npm i @blueworld/dictionarray -S

Usage

Import the TypeScript module into your project files:

import DictionArray from "@blueworld/dictionarray";

Constructor

The constructor of the generic DictionArray class receives a type and an object of index functions that we want to build up.

Let's consider the following example:

interface Test {
    id: number;
    text: string;
}

const d = new DictionArray<Test>({
    identifier: (elem: Test) => {
        return elem.id.toString();
    }
});

We instantiate a new DictionArray of type Test. We also specify an index with the name identifier. The index function extracts the property id of the element of type Test. Everytime a new element is added or removed to and from the DictionArray, the index for identifier is updated by running the index function across all elements of the DictionArray.

Note: The index function only accepts strings as return values. If you want your numeric id property to be indexed, you have to cast it into a string first, as seen in the example above. This is due to the fact that the extracted property per element of object T will become a key in an ECMAScript object internally.

push(...item: T[]): number

The push method works analogous to the standard ECMAScript Array.push() method. It takes n-many objects of type T and returns the new length of the array.

Example:

d.push({
    id: 123,
    text: "Test"
});

Triggers reindex: ✅

lookup(index: string, qualifier: string): number[]

This is where the magic of the DictionArray happens. We can push objects onto the array-part of the DictionArray, but what if we want to find a single element in the data structure without looping the whole array? Glad you're asking! Since we declared an index of name identifier in the Constructor-section above, we can use this index to lookup elements O(1) runtime.

const pos: number[] = d.lookup("identifier", "123");

The contant pos will now contain the positions of the objects of type T with the identifier of value 123 within the dictionarray.

Triggers reindex: ❌

get(index: number): T

To read an object at a certain position within the DictionArray, use the get() method.

Example:

const obj: Test = d.get(0);

Will return the first object within the DictionArray.

Triggers reindex: ❌

count(): number

count() returns the length of the array within the DictionArray.

Example:

const length: number = d.count();

Triggers reindex: ❌

all(): T[]

The retrieve all elements of the DictionArray in array form, use the all() function:

const elements: Test[] = d.all();

Triggers reindex: ❌

clear(): void

To remove all elements from the DictionArray use the clear() method:

d.clear();

Triggers reindex: ❌ (well, the index is completely cleared)

map(callbackFn: (item: T, index: number) => any): any[]

Proxy function for the map() function of the underlaying array within the DictionArray.

Example:

const result = d.map((item) => {
    return item.text;
});

Triggers reindex: ❌

filter(callbackFn: (item: T, index?: number) => boolean): T[]

Proxy function for the filter() function of the underlaying array within the DictionArray.

Example:

const result: Test[] = d.filter((item) => {
    return item.text.length > 2;
});

Triggers reindex: ❌

splice(start: number, deleteCount: number, items?: T[]): T[]

The splice() method changes the contents of an array by removing or replacing existing elements and/or adding new elements.

Works analogous to the ECMAScript splice() function.

Example:

d.splice(0, 1);

This removes the first item from the array.

Triggers reindex: ✅