Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/maximilianmairinger/keyindex
Memoize on demand map
https://github.com/maximilianmairinger/keyindex
index key map memoize
Last synced: about 1 month ago
JSON representation
Memoize on demand map
- Host: GitHub
- URL: https://github.com/maximilianmairinger/keyindex
- Owner: maximilianMairinger
- Created: 2020-06-30T13:54:43.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-03-06T14:10:27.000Z (10 months ago)
- Last Synced: 2024-11-06T18:55:45.212Z (about 2 months ago)
- Topics: index, key, map, memoize
- Language: JavaScript
- Homepage: https://www.npmjs.com/package/key-index
- Size: 40 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Key Index
Key based index store.
## Installation
```shell
$ npm i key-index
```## Usage
### Create an index
Import
```ts
import keyIndex from "key-index"
```Create an instance
```ts
let initer = (pointer: string) => {
return {name: pointer}
}let index = keyIndex(initer)
```### Query
When querying a key that is not assigned to a value yet, one is automatically created via the given `initer` function.
```ts
let a = index("keyA") // {name: "keyA"}
a.prop = "val"
index("keyA") // {name: "keyA", prop: "val"}
```(Mostly for debugging purposes) you can also query the whole document
```ts
let a = index() // Map: {
// "keyA": {
// "name": "keyA"
// "prop": "val"
// }
// }
```The index is stored in a Map by default. If youd like to use a regular object as index instead use
```ts
import { constructObjectIndex as keyIndex } from "key-index"
```All functionality is the same here. The only difference is the underlying technology used.
> Note: that native objects do only support strings | number | symbol as indices!
### Using other initers
This is the default initer
```ts
keyIndex(/* () => {return {}} */)
```#### Using values directly
You can use values directly. If your use case does only need one value.
```ts
let valueIndex = keyIndex((key) => key)
valueIndex("keyA") // "keyA"
```In that (and every other) case you can change the value like so:
```ts
valueIndex("keyA", "keyAValue") // "keyAValue"
valueIndex("keyA") // "keyAValue"
```#### Nested indices
If using your use case requires nested indices consider this
```ts
let nestedIndex = keyIndex(() => keyIndex(/* () => {return {}} */))
nestedIndex("keyA")("keyB") // {}
```Querying the whole document does also work here
```ts
nestedIndex("keyA")("keyB").key = "val"
nestedIndex("keyA")("keyC").key = "val"
nestedIndex("keyD")("keyE").key1 = "val1"
nestedIndex("keyD")("keyE").key2 = "val2"nestedIndex() // Map {
// "keyA": Map {
// "keyB": { key: "val" }
// "keyC": { key: "val" }
// }
// "keyD": Map {
// "keyE": { key1: "val1", key2: "val2" }
// }
// }
```> Note: Depending on the underlying technology (maps / objects) this may yield slightly different results (all maps would be regular objects).
## Contribute
All feedback is appreciated. Create a pull request or write an issue.