You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
3.0 KiB
Markdown
69 lines
3.0 KiB
Markdown
# generate-lookup-table
|
|
|
|
Generates a (fast!) lookup table or index from any array of items.
|
|
|
|
__When to use this:__ When you might otherwise be looping through an array *many times* (eg. using `Array#find`), trying to locate an item(s) with a particular property.
|
|
|
|
If you'd otherwise only loop through the array *once*, it's probably faster *not* to use this library, and just do the loop - building a lookup table, while still quite fast in the bigger picture, takes time.
|
|
|
|
## License, donations, and other boilerplate
|
|
|
|
Licensed under either the [WTFPL](http://www.wtfpl.net/txt/copying/) or [CC0](https://creativecommons.org/publicdomain/zero/1.0/), at your choice. In practice, that means it's more or less public domain, and you can do whatever you want with it. Giving credit is *not* required, but still very much appreciated! I'd love to [hear from you](mailto:admin@cryto.net) if this module was useful to you.
|
|
|
|
Creating and maintaining open-source modules is a lot of work. A donation is also not required, but much appreciated! You can donate [here](http://cryto.net/~joepie91/donate.html).
|
|
|
|
## Usage
|
|
|
|
```js
|
|
"use strict";
|
|
|
|
const generateLookupTable = require("generate-lookup-table");
|
|
|
|
// Thanks to https://gist.github.com/nanotaboada/6396437 for the sample data!
|
|
|
|
let items = [
|
|
{ name: "Eloquent JavaScript, Second Edition", tags: [ "javascript", "No Starch Press" ] },
|
|
{ name: "Learning JavaScript Design Patterns", tags: [ "javascript", "O'Reilly Media" ] },
|
|
{ name: "Speaking JavaScript", tags: [ "javascript", "O'Reilly Media" ] },
|
|
{ name: "Programming JavaScript Applications", tags: [ "javascript", "O'Reilly Media" ] },
|
|
{ name: "Understanding ECMAScript 6", tags: [ "javascript", "No Starch Press" ] },
|
|
{ name: "You Don't Know JS", tags: [ "javascript", "O'Reilly Media" ] },
|
|
{ name: "Git Pocket Guide", tags: [ "git", "O'Reilly Media" ] },
|
|
{ name: "Designing Evolvable Web APIs with ASP.NET", tags: [ "asp.net", "O'Reilly Media" ] },
|
|
];
|
|
|
|
let lookupTable = generateLookupTable(items, (item) => item.tags);
|
|
|
|
console.log(lookupTable.get("git"));
|
|
|
|
/* Output:
|
|
[ { name: 'Git Pocket Guide', tags: [ 'git', 'O\'Reilly Media' ] } ]
|
|
*/
|
|
|
|
console.log(lookupTable.get("No Starch Press"));
|
|
|
|
/* Output:
|
|
[ { name: 'Eloquent JavaScript, Second Edition',
|
|
tags: [ 'javascript', 'No Starch Press' ] },
|
|
{ name: 'Understanding ECMAScript 6',
|
|
tags: [ 'javascript', 'No Starch Press' ] } ]
|
|
*/
|
|
```
|
|
|
|
## API
|
|
|
|
### generateLookupTable(items, keyFunction)
|
|
|
|
Generates a lookup table for the given set of `items`, using the `keyFunction` to determine what key(s) each item should be registered for.
|
|
|
|
- __items:__ The array of items to index.
|
|
- __keyFunction(item):__ A function that, given an `item` as its argument, returns the key(s) for that item. The function may return either a single key, an array of them, or nothing at all.
|
|
|
|
Returns a `Map` that maps from a key (as returned from the `keyFunction`) to all items that returned that particular key.
|
|
|
|
## Changelog
|
|
|
|
### v1.0.0 (February 21, 2020)
|
|
|
|
Initial release.
|