Multiple indexes on a single collection of objects
Last updated a year ago by binaris .
MIT · Repository · Bugs · Original npm · Tarball · package.json
$ cnpm install multi-index 
SYNC missed versions from official npm registry.

Build status

Multi-Index: Containers with more than one index

Multi-index separates container storage from indexing. You store a set of objects and access them using any key you can compute from those objects.


Create a container:

import { Container, uniqueIndex, nonuniqueIndex } from 'multi-index';

interface Contact {
  id: string; // unique
  name: string;
  nickname: string;
  phone?: string;

const c = new Container<Contact>();

Everything works if you're using JavaScript, you'll just not bother with types:

const { Container, uniqueIndex, nonuniqueIndex } = require('multi-index');

const c = new Container();

Usually you'd add some indexes, but you can already add objects to that container:

const joeBloggs = { id: 17, name: 'Joe Bloggs', nickname: 'joe', phone: '+972-99-555-6666' };
 .add({ id: 19, name: 'Ariel Shaqed (Scolnicov)', nickname: 'ariels', phone: '+972-99-666-5555', })
 .add({ id: 23, name: 'Joseph', nickname: 'joe', });

You can also delete, but it has to be the same object you added:


But let's keep Mr. Bloggs in there so we can look at indices...



Add a few indices:

const byId = uniqueIndex({ id }: Contact => id, 'by id').on(c);
const byNickname = nonuniqueIndex({ nickname }: Contact => nickname, 'by nickname').on(c);

Or in JavaScript, just don't add types to the functions:

const byId = uniqueIndex({ id } => id, 'by id').on(c);
const byNickname = nonuniqueIndex({ nickname } => nickname, 'by nickname').on(c);

Unique indices won't let you add the same element twice:

c.add({ id: 19, name: 'Impostor', nickname: 'ariels' });  // throws NonuniqueIndexError

(They also test for uniqueness if you add them to a container with existing indexes, so byNickname above could not be unique.)

Now you can look up elements:

byId.get(23);  // returns { id: 23, name: 'Joseph', nickname: 'joe' }
byNickname.get('joe');  // returns Set([{ id: 23, name: 'Joseph', nickname: 'joe' }, joeBloggs])

Related projects

  • indexify: A similar lightweight package, supports containers with multiple indexes. API is not type-safe for TypeScript. Less extensible.
  • bimap: A specific container with 2 indices. You could implement a bidirectional map using a multi-index container.
  • bim: Another bidirectional map.
  • mnemonist: A variety of lower-level data structures. Unfortunately does not include multi-indexed containers.
  • Boost multi_index: the ultimate multi-indexed container, for C++; highly performant.

Current Tags

  • 0.0.2                                ...           latest (a year ago)

1 Versions

  • 0.0.2                                ...           a year ago
Maintainers (1)
Today 0
This Week 0
This Month 0
Last Day 0
Last Week 0
Last Month 0
Dependencies (0)
Dev Dependencies (2)
Dependents (0)

Copyright 2014 - 2016 © |