Skip to content

"Keyed and Indexed Map", a pure javascript object that simulates the native 'Map' object with indexing features and others useful methods.

License

Notifications You must be signed in to change notification settings

giacomoratta/ki-map

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

kiMap

NPM

Pure javascript object that simulates the native 'Map' object with indexing features and others useful methods.

Documentation

Install

npm install --save kiMap

Methods and properties

Create the kiMap object

let kiMap = require('ki-map');
let map = new kiMap();

setLogger(obj)

Set the logger object. By default is the native console object.

  • {object|null} obj - (optional, default:console) a console-like object
map.setLogger(mylogger);
map.setLogger(null); //To disable internal logging just pass a null object.

debug(options)

Show the internal data-structures and makes some simple checks.

  • {object} options - (optional, default:null) set the debug output
map.debug({
    label:'',           // for a labeled debug output
    complete:false      // print all the internal structures
});

size

Current size of the collection.

  • returns {integer} - values:[0,+inf)
let length = map.size;

clear()

Empty all internal structures and reset the counters. After this, the kiMap is totally cleaned.

map.clear();

delete(ki)

Removes the specified element from the collection.

  • param {number|string} ki - key or index
  • returns {integer} index of the deleted item or a number<0
map.delete(3);
map.delete('label6');
if(map.delete(4)<0) console.warn('No object found!');

entries()

All the elements stored within the collection.

  • returns {iterator}
let it1 = map.entries();
let d1 = it1.next();
while(!d1.done){
    console.log('index:',d1.value.i);
    console.log('key:',d1.value.k);
    console.log('data:',d1.value.d);
    d1 = it1.next();
}

forEach(callback, thisArg)

Executes a provided function once per each key/value pair in the Map object, in insertion order.

  • param {function} callback - Function to execute for each element; prototype: callback(index,key,value,kiMap)
  • param {object} thisArg - Value to use as this when executing callback.
// Simple forEach
x.forEach(function(i,k,d,map){
    console.log('index:',i);
    console.log('key:',k);
    console.log('data:',d);
});

// Usage of thisArg
class exampleClass{
    fn(){
        map.forEach(function(i,k,d,this_map){
            this.show(i,k,d,this_map);
        },this);
    }
    show(i,k,d,this_map){
        console.log('index:',i);
        console.log('key:',k);
        console.log('data:',d);
    }
}
let myObj = new exampleClass();
myObj.fn();

get(ki)

Get an element from the collection.

  • param {integer|string} ki - key or index
  • returns {mixed|null} null if data not found
map.get(1);
map.get('label');

has(ki)

Returns a boolean indicating whether an element with the specified key exists or not.

  • param {integer|string} ki - key or index
  • returns {boolean}
map.has(1);
map.has('label');

keys()

All the keys within the collection.

  • returns {array}
map.keys(); //returns ['label1','label2','label3']

set(ki, value, options)

Adds or updates an element with a specified index and/or key and value.

  • param {integer|string} ki - key or index
  • param {any} value
  • param {object} options - 'key' used when ki is an index, ...
  • returns {number} index of the new element
// Insertion with label
x.set('label1',{oo:'obj1',cc:1}); // 1

// Simple insertion (the label will be 'autokey_1')
x.set({oo:'obj2',cc:2});  // 2

// Insertion in the specified position 3
x.set(3,{oo:'obj3',cc:3});  // 3

// Insertion in the specified position 3 with label 'mykey44'
x.set(4,{oo:'obj44',cc:44},{
    key:'mykey44'
})); // 4

values()

Returns a new Iterator object that contains the values for each element in the Map object in insertion order.

  • returns {iterator}
let it1 = map.entries();
let d1 = it1.next();
while(!d1.done){
    console.log('data:',d1.value);
    d1 = it1.next();
}

indexOf(key)

Returns the index of the element stored with the specified key.

  • param {string} key
  • returns {number} - a value lower than zero indicates that the element was not found
map.indexOf('label3');

keyOf(index)

Returns the key of the element stored within the specified index.

  • param index
  • returns {string|null} - null indicates that the element was not found
map.keyOf(3);

keyUpdate(old_key, new_key, force)

Update the key of an item. If an item with new_key already exists, this method does nothing. To force the update and the overwrite, set force=true.

  • param {string} old_key
  • param {string} new_key
  • param {boolean} force (optional, default:false)
  • return {integer} position of the updated element
map.keyUpdate('label1', 'newlabel1'); // 1
map.keyUpdate('label3', 'label1'); // -1 - no update
map.keyUpdate('label3', 'label1', true); // 3 - the element 1 will have 'autokey_4'

setMany(kv_array)

Insert a bunch of values from an array. In case of key collisions, the key of the new element will be changed with an 'autokey_xx'.

  • param {Array} kv_array - simple array or array with couples [key,value]
  • returns {boolean} true if the insertion is done
map.setMany([
    ['tag20',{oo:'obj20',cc:20}],
    ['tag21',{oo:'obj21',cc:21}]
]);
map.setMany([
    {oo:'obj30',cc:30},
    {oo:'obj31',cc:31}
]);

merge(map)

Extends the current map with the values inside the 'map' argument. In case of key collisions, the key of the new element will be changed with an 'autokey_xx'.

  • param {kiMap} map
  • returns {boolean} true if the insertion is done
map1.merge(map2);

swap(ki_A,ki_B)

Swap two items.

  • param {string|integer} ki_A - key or index
  • param {string|integer} ki_B - key or index
  • return {boolean}
map.swap('label1','label2');
map.swap('label1',1);
map.swap(0,'label2');
map.swap(0,1);

move(ki, pos)

Move the item with ki to the specified position

  • param {string|number} ki - key or index
  • param {integer} pos - final position
  • returns {integer}
map.move('label1',4);
map.move(0,4);

Examples

The directory '/examples' has some useful examples ready to be executed as node scripts.

node ./examples/e1.js
  • e1.js - Example 1 > Fill, move and swap
  • e2.js - Example 2 > Iterators usage
  • e3.js - Example 3 > kiMap.forEach() usage
  • e4.js - Example 4 > Mixed basic functions: size, get, keyOf, indexOf, has, keys, clear
  • e5.js - Example 5 > kiMap.keyUpdate() usage
  • e6.js - Example 6 > kiMap.setMany() and kiMap.merge() usage

Bugs or requests

I am still working on this project. So, please, report me any kind of bug or requests about new features. You can do it on GitHub Issues or via email. I will try to solve each issues in a reasonable time.

About

"Keyed and Indexed Map", a pure javascript object that simulates the native 'Map' object with indexing features and others useful methods.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published