TEXT   16

ObjectMap.js

Guest on 6th June 2021 05:36:51 AM

  1. /**
  2.  * Simple `object` to `object` map using a native WeakMap on supported browsers, otherwise a set of two arrays.
  3.  *
  4.  * If you're looking for a dictionary with string keys, please see `WoltLabSuite/Core/Dictionary`.
  5.  *
  6.  * @author  Alexander Ebert
  7.  * @copyright     2001-2021 WoltLab GmbH
  8.  * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
  9.  * @module  ObjectMap (alias)
  10.  * @module  WoltLabSuite/Core/ObjectMap
  11.  */
  12. define([], function() {
  13.       "use strict";
  14.      
  15.       var _hasMap = objOwns(window, 'WeakMap') && typeof window.WeakMap === 'function';
  16.      
  17.       /**
  18.        * @constructor
  19.        */
  20.       function ObjectMap() {
  21.             this._map = (_hasMap) ? new WeakMap() : { key: [], value: [] };
  22.       }
  23.       ObjectMap.prototype = {
  24.             /**
  25.              * Sets a new key with given value, will overwrite an existing key.
  26.              *
  27.              * @param   {object}    key   key
  28.              * @param   {object}    value value
  29.              */
  30.             set: function(key, value) {
  31.                   if (typeof key !== 'object' || key === null) {
  32.                         throw new TypeError("Only objects can be used as key");
  33.                   }
  34.                  
  35.                   if (typeof value !== 'object' || value === null) {
  36.                         throw new TypeError("Only objects can be used as value");
  37.                   }
  38.                  
  39.                   if (_hasMap) {
  40.                         this._map.set(key, value);
  41.                   }
  42.                   else {
  43.                         this._map.key.push(key);
  44.                         this._map.value.push(value);
  45.                   }
  46.             },
  47.            
  48.             /**
  49.              * Removes a key from the map.
  50.              *
  51.              * @param   {object}    key   key
  52.              */
  53.             'delete': function(key) {
  54.                   if (_hasMap) {
  55.                         this._map['delete'](key);
  56.                   }
  57.                   else {
  58.                         var index = this._map.key.indexOf(key);
  59.                         this._map.key.splice(index);
  60.                         this._map.value.splice(index);
  61.                   }
  62.             },
  63.            
  64.             /**
  65.              * Returns true if dictionary contains a value for given key.
  66.              *
  67.              * @param   {object}    key   key
  68.              * @return  {boolean}   true if key exists
  69.              */
  70.             has: function(key) {
  71.                   if (_hasMap) {
  72.                         return this._map.has(key);
  73.                   }
  74.                   else {
  75.                         return (this._map.key.indexOf(key) !== -1);
  76.                   }
  77.             },
  78.            
  79.             /**
  80.              * Retrieves a value by key, returns undefined if there is no match.
  81.              *
  82.              * @param   {object}    key   key
  83.              * @return  {*}
  84.              */
  85.             get: function(key) {
  86.                   if (_hasMap) {
  87.                         return this._map.get(key);
  88.                   }
  89.                   else {
  90.                         var index = this._map.key.indexOf(key);
  91.                         if (index !== -1) {
  92.                               return this._map.value[index];
  93.                         }
  94.                        
  95.                         return undefined;
  96.                   }
  97.             }
  98.       };
  99.      
  100.       return ObjectMap;
  101. });

Raw Paste


Login or Register to edit or fork this paste. It's free.