Giter Club home page Giter Club logo

multi-map's Introduction

Multimap - Map which Allow Multiple Values for the same Key

NPM version Build Status

Install

npm install multimap --save

Usage

If you'd like to use native version when it exists and fallback to polyfill if it doesn't, but without implementing Map on global scope, do:

var Multimap = require('multimap');
var m = new Multimap();

If the global es6 Map exists or Multimap.Map is set, Multimap will use the Map as inner store, that means Object can be used as key.

var Multimap = require('multimap');

// if harmony is on
/* nothing need to do */
// or if you are using es6-shim
Multimap.Map = ShimMap;

var m = new Multimap();
var key = {};
m.set(key, 'one');

Otherwise, an object will be used, all the keys will be transformed into string.

In Modern Browser

Just download the index.js as Multimap.js.

<script src=Multimap.js"></script>
<script>
var map = new Multimap([['a', 1], ['b', 2], ['c', 3]]);
map = map.set('b', 20);
map.get('b'); // [2, 20]
</script>

Or use as an AMD loader:

require(['./Multimap.js'], function (Multimap) {
  var map = new Multimap([['a', 1], ['b', 2], ['c', 3]]);
  map = map.set('b', 20);
  map.get('b'); // [2, 20]
});
  • Browsers should support Object.defineProperty and Array.prototype.forEach.

API

Following shows how to use Multimap:

var Multimap = require('multimap');

var map = new Multimap([['a', 'one'], ['b', 1], ['a', 'two'], ['b', 2]]);

map.size;                 // 4
map.count;                // 2

map.get('a');             // ['one', 'two']
map.get('b');             // [1, 2]

map.has('a');             // true
map.has('foo');           // false

map.has('a', 'one');      // true
map.has('b', 3);          // false

map.set('a', 'three');
map.size;                 // 5
map.count;                // 2
map.get('a');             // ['one', 'two', 'three']

map.set('b', 3, 4);
map.size;                 // 7
map.count;                // 2

map.delete('a', 'three'); // true
map.delete('x');          // false
map.delete('a', 'four');  // false
map.delete('b');          // true

map.size;                 // 2
map.count;                // 1

map.set('b', 1, 2);
map.size;                 // 4
map.count;                // 2


map.forEach(function (value, key) {
  // iterates { 'one', 'a' }, { 'two', 'a' }, { 1, b }, { 2, 'b' }
});

map.forEachEntry(function (entry, key) {
  // iterates {['one', 'two'], 'a' }, {[1, 2], 'b' }
});


var keys = map.keys();      // iterator with ['a', 'b']
keys.next().value;          // 'a'
var values = map.values();  // iterator ['one', 'two', 1, 2]

map.clear();                // undefined
map.size;                   // 0
map.count;                  // 0

License

(The MIT License)

Copyright (c) 2013, Villa.Gao [email protected]; All rights reserved.

multi-map's People

Contributors

villadora avatar korynunn avatar michaelficarra avatar

Stargazers

Ashley D avatar Jahan Addison avatar Marius Metzger avatar Dario Vladović avatar Toan Tran avatar nakajima a.k.a. nazomikan avatar me avatar 4sizn avatar Matthew avatar Roble-wiz avatar Daniel Shuy avatar Catarina de Paula Bressan avatar Kenton Gray avatar chun shang avatar Athan avatar  avatar Leo avatar

Watchers

 avatar James Cloos avatar Marutha avatar

multi-map's Issues

get returns reference to inner array

This is perhaps expected, but is it correct?

	it( 'results of prevous get should not be modified by future set', () => {
		let map = new Multimap( [['a',1]]);
		
		let aList = map.get('a');
		assert.strictEqual(aList.length, 1);
		
		map.set('a', 2);
		
		// aList.length is now 2
		assert.strictEqual(aList.length, 1);
	});

values() is not a function or its return value is not iterable

With the next code

[...mediasoupWorkers.values()]

being mediasoupWorkers an instance of multimap I get the error TypeError: mediasoupWorkers.values is not a function or its return value is not iterable. Seems like multimap doesn't fully implement the iterable and/or iterator protocol, just only return an object with a next method, and the coversion to an array doesn't works.

Specify whether the order of insertion is preserved or not

Can you please comment on the order in which keys and values will be returned when iterating this?

JavaScript Map for instance guarantees that iterating over the map returns the keys in the order in which they where inserted.

I assume this library just preserves the order in which the keys where first inserted, and on enumerating keys and values, all values for a fixed key are returned before the key changes.

But you don't specify any guarantees about order anywhere.

This makes it hard to judge whether we can rely on any ordering or not.

In my use case, I absolutely require that the order in which values for the same key are inserted is preserved...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.