diff --git a/dev/objectarray.js b/dev/objectarray.js index 104cc99..293476d 100644 --- a/dev/objectarray.js +++ b/dev/objectarray.js @@ -1,4 +1,14 @@ -/******/ (function(modules) { // webpackBootstrap +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else { + var a = factory(); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})(typeof self !== 'undefined' ? self : this, function() { +return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ @@ -74,6 +84,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -81,24 +93,30 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons /** * @file ObjectArray class declaration * @author Liqueur de Toile -* @license Apache-2.0 {@link https://www.apache.org/licenses/LICENSE-2.0} +* @license MIT {@link https://choosealicense.com/licenses/mit/} +* @see [Github]{@link https://github.com/liqueurdetoile/objectarray} +* @see [Author website]{@link https://liqueurdetoile.com} */ /** * @classDesc -* The ObjectArray class implements array-like properties and methods to -* a key/value javascript object. -* -* It can be viewed as a kind of associative array in JS. +* The ObjectArray class implements array-like properties and methods to a key/value javascript object.* +* It can be viewed as a kind of associative array in JS but it also +* supports dot notation keys. * * @class ObjectArray * @since 1.0.0 * @version 1.0.0 * @author Liqueur de Toile +* @license MIT {@link https://choosealicense.com/licenses/mit/} +* @see [Github]{@link https://github.com/liqueurdetoile/objectarray} +* @see [Author website]{@link https://liqueurdetoile.com} * -* @param {Object} data +* @param {Object} data Initial data to push into the ObjectArray * * @returns {ObjectArray} ObjectArray object +* @description +* The constructor is straight-forward. It can be provided with an existent object */ var ObjectArray = function () { @@ -120,21 +138,93 @@ var ObjectArray = function () { } /** - * Returns length of the ObjectArray + * Getter/setter for the root data of ObjectArray. * - * @alias ObjectArray~length - * @type Number + * @alias ObjectArray~data + * @type Object * @since 1.0.0 * @version 1.0.0 * @author Liqueur de Toile - * - * @returns {Number} Length of the ObjectArray */ _createClass(ObjectArray, [{ - key: 'has', + key: 'length', + + + /** + * Returns length of a given dataset in the ObjectArray + * If no parent key is provided, it will output the length of + * the root data object + * + * @method ObjectArray~length + * @since 1.0.0 + * @version 1.0.0 + * @author Liqueur de Toile + * + * @param {dottedKey} pKey Parent key + * @returns {Number|undefined} Length of the dataset or undefined if key doesn't exist + */ + value: function length(pKey) { + var data = this.keys(pKey); + + if (!data) return undefined; + return this.keys(pKey).length; + } + + /** + * Returns keys of a given dataset in the ObjectArray + * If no parent key is provided, it will output the keys of + * the root data object + * + * @method ObjectArray~keys + * @since 1.0.0 + * @version 1.0.0 + * @author Liqueur de Toile + * + * @param {dottedKey} pKey Parent key + * @returns {Array|undefined} Array of keys for the dataset + * or undefined if key doesn't exist + */ + + }, { + key: 'keys', + value: function keys(pKey) { + var keys = [], + data = this.dataset(pKey); + + if (!data) return undefined; + for (var key in data) { + keys.push(key); + }return keys; + } + + /** + * Returns values of a given dataset in the ObjectArray + * If no parent key is provided, it will output the keys of + * the root data object + * + * @method ObjectArray~values + * @since 1.0.0 + * @version 1.0.0 + * @author Liqueur de Toile + * + * @param {dottedKey} pKey Parent key + * @returns {Array|undefined} Array of values for the dataset + * or undefined if key doesn't exist + */ + }, { + key: 'values', + value: function values(pKey) { + var values = [], + data = this.dataset(pKey); + + if (!data) return undefined; + for (var key in data) { + values.push(data[key]); + }return values; + } /** * Check if a given key exists in the ObjectArray @@ -145,17 +235,21 @@ var ObjectArray = function () { * @version 1.0.0 * @author Liqueur de Toile * - * @param {String} key Key - * @returns {Array} Array of ObjectArray values + * @param {dottedKey} key Key + * @returns {Boolean} true if key exists, false otherwise */ + + }, { + key: 'has', value: function has(key) { var i = void 0, k = void 0, - data = this._data; + data = this.data; key = key.split('.'); for (i = 0; i < key.length; i++) { k = key[i]; + if (typeof data[k] === 'undefined') return false; data = data[k]; } @@ -166,29 +260,28 @@ var ObjectArray = function () { * Returns dataset for the key. If no key is provided, * the whole data is returned * - * @alias ObjectArray~data - * @type Array + * @alias ObjectArray~dataset + * @type Object * @since 1.0.0 * @version 1.0.0 * @author Liqueur de Toile * - * @param {String} [key=null] Key - * @returns {Array} Array of ObjectArray values + * @param {dottedKey} [key=null] Key + * @returns {Object|undefined} Data object or undefined if key doesn't exist */ }, { - key: 'data', - value: function data() { - var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - + key: 'dataset', + value: function dataset(key) { var i = void 0, k = void 0, - data = this._data; + data = this.data; - if (key !== null) { + if (key !== undefined) { key = key.split('.'); for (i = 0; i < key.length; i++) { k = key[i]; + if (typeof data[k] === 'undefined') return undefined; data = data[k]; } @@ -197,56 +290,60 @@ var ObjectArray = function () { } /** - * Runs a callback on each ObjectArray entry + * Returns the parent key for a given key * - * @method ObjectArray~forEach + * @alias ObjectArray~parentKey + * @type Array * @since 1.0.0 * @version 1.0.0 * @author Liqueur de Toile * - * @param {forEachCallback} cb Callback to be run - * @param {String} [key=null] Dotted key to limit iterations through its subset - * @returns {void} + * @param {dottedKey} key Key + * @returns {String} Parent key */ }, { - key: 'forEach', - value: function forEach(cb) { - var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - - var data = this.data(key); - var index = 0; + key: 'parentKey', + value: function parentKey(key) { + if ((typeof key === 'undefined' ? 'undefined' : _typeof(key)) !== undefined) { + key = key.split('.'); + key.pop(); - for (var _key in data) { - cb.call(this, data[_key], _key, index++); + if (key.length) { + key = key.join('.'); + return key; + } } + return undefined; } /** - * Push a new key/value pair at the end of the ObjectArray + * Push a new key/value pair * * @method ObjectArray~push * @since 1.0.0 * @version 1.0.0 * @author Liqueur de Toile * - * @param {String} key Key of the added item + * @param {dottedKey} key Key of the added item * @param {Number|String|Array|Object} val Value of the added item + * @param {dottedKey} [pKey] Parent key to push into * @returns {ObjectArray} Return self for chaining */ }, { key: 'push', - value: function push(key, val) { - var path = this._data; + value: function push(key, val, pKey) { + var k = void 0, + data = this.dataset(pKey); key = key.split('.'); + k = key.pop(); key.forEach(function (k, i) { - if (i < key.length - 1) { - if (!path[k]) path[k] = {}; - path = path[k]; - } else path[k] = val; + if (typeof data[k] === 'undefined') data[k] = {}; + data = data[k]; }); + data[k] = val; return this; } @@ -258,22 +355,20 @@ var ObjectArray = function () { * @version 1.0.0 * @author Liqueur de Toile * - * @param {String} key Key of the added item + * @param {dottedKey} key Key of the added item * @returns {ObjectArray} Return self for chaining */ }, { key: 'remove', value: function remove(key) { - var path = this._data; + var pKey = this.parentKey(key); + var data = this.dataset(pKey); - key = key.split('.'); - key.forEach(function (k, i) { - if (i < key.length - 1) { - if (!path[k]) path[k] = {}; - path = path[k]; - } else delete path[k]; - }); + if (data) { + key = key.replace(pKey + '.', ''); + delete data[key]; + } return this; } @@ -286,17 +381,43 @@ var ObjectArray = function () { * @author Liqueur de Toile * * @param {Object} Data Object to import + * @param {dottedKey} [pKey] Dotted parent key to import into * @returns {ObjectArray} Return self for chaining */ }, { key: 'import', - value: function _import(data) { + value: function _import(data, pKey) { for (var key in data) { - this.push(key, data[key]); + this.push(key, data[key], pKey); }return this; } + /** + * Runs a callback on each ObjectArray entry + * + * @method ObjectArray~forEach + * @since 1.0.0 + * @version 1.0.0 + * @author Liqueur de Toile + * + * @param {forEachCallback} cb Callback to be run + * @param {dottedKey} [key] Dotted key to limit iterations through its subset + * if empty, the global data object will be used + * @returns {void} + */ + + }, { + key: 'forEach', + value: function forEach(cb, key) { + var data = this.dataset(key); + var index = 0; + + for (var _key in data) { + cb.call(this, data[_key], _key, index++); + } + } + /** * Reduce the ObjectArray data given a callback * @@ -307,17 +428,19 @@ var ObjectArray = function () { * * @param {Callback} reducer Callback to apply to each key/value (from left) * @param {Mixed} [start] Initial value for iteration + * @param {dottedKey} [key] Dotted key to limit iterations through its subset + * if empty, the global data object will be used * @returns {Mixed} Callback returns value */ }, { key: 'reduce', - value: function reduce(reducer, start) { + value: function reduce(reducer, start, key) { var acc = start; - this.forEach(function (value, key) { - acc = reducer(acc, value, key); - }); + this.forEach(function (value, k) { + acc = reducer(acc, value, k); + }, key); return acc; } @@ -329,84 +452,73 @@ var ObjectArray = function () { * @version 1.0.0 * @author Liqueur de Toile * + * @param {dottedKey} [key] Dotted key to limit iterations through its subset + * if empty, the global data object will be used * @returns {String} style string */ }, { key: 'styleString', - value: function styleString() { - var ret = this.reduce(function (str, value, key) { - str += key + ':' + value + ';'; + value: function styleString(key) { + var ret = this.reduce(function (str, value, k) { + str += k + ':' + value + ';'; return str; - }, ''); + }, '', key); return ret.substr(0, ret.length - 1); } - }, { - key: 'urlEncode', - value: function urlEncode() { - var ret = this.reduce(function (str, value, key) { - str += key + '=' + encodeURIComponent(value) + '&'; - return str; - }, ''); - - return ret.substr(0, ret.length - 1); - } - }, { - key: 'formUrlEncode', - value: function formUrlEncode() { - var ret = this.urlEncode(); - - return ret.replace('%20', '+'); - } - }, { - key: 'length', - get: function get() { - return this.keys.length; - } /** - * Returns keys of the ObjectArray + * Returns a string suitable for a URI query string * - * @alias ObjectArray~keys - * @type Array + * @method ObjectArray~urlEncode * @since 1.0.0 * @version 1.0.0 * @author Liqueur de Toile * - * @returns {Array} Array of ObjectArray keys + * @param {dottedKey} [key] Dotted key to limit iterations through its subset + * if empty, the global data object will be used + * @returns {String} style string */ }, { - key: 'keys', - get: function get() { - var keys = []; + key: 'urlEncode', + value: function urlEncode(key) { + var ret = this.reduce(function (str, value, key) { + str += key + '=' + encodeURIComponent(value) + '&'; + return str; + }, '', key); - for (var key in this._data) { - keys.push(key); - }return keys; + return ret.substr(0, ret.length - 1); } /** - * Returns values of the ObjectArray + * Returns a string suitable for a form-url-encoded query string * - * @alias ObjectArray~values - * @type Array + * @method ObjectArray~formUrlEncode * @since 1.0.0 * @version 1.0.0 * @author Liqueur de Toile * - * @returns {Array} Array of ObjectArray values + * @param {dottedKey} [key] Dotted key to limit iterations through its subset + * if empty, the global data object will be used + * @returns {String} style string */ }, { - key: 'values', - get: function get() { - var values = []; + key: 'formUrlEncode', + value: function formUrlEncode(key) { + var ret = this.urlEncode(key); - for (var key in this._data) { - values.push(this._data[key]); - }return values; + return ret.replace('%20', '+'); + } + }, { + key: 'data', + get: function get() { + return this._data; + }, + set: function set(data) { + this.import(data); } }]); @@ -415,6 +527,33 @@ var ObjectArray = function () { exports.default = ObjectArray; + +if (window) window.ObjectArray = ObjectArray; + +/** +* @typedef dottedKey +* @type String +* @description +* A dotted key is useful to quickly access a subset of data +* stored into the ObjectArray as if it was still a +* vanilla Object. +* @example +* // Create an ObjectArray with subdata +* var oa = new ObjectArray({ +* set1: { +* subset1: 'foo', +* subset2: { +* subsub1: 'bar', +* subsub2: 'baz' +* } +* } +* }); +* // 'set1.subset1' will yield to 'foo' +* // 'set1.subset1.subsub2' will yield to 'baz' +* +*/ + /***/ }) /******/ ]); +}); //# sourceMappingURL=objectarray.js.map \ No newline at end of file diff --git a/dev/objectarray.js.map b/dev/objectarray.js.map index a75a385..dbdec57 100644 --- a/dev/objectarray.js.map +++ b/dev/objectarray.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 4eee2cd4945eec5d67b2","webpack:///./src/index.js"],"names":["ObjectArray","data","_data","import","key","i","k","split","length","undefined","cb","index","call","val","path","forEach","push","reducer","start","acc","value","ret","reduce","str","substr","encodeURIComponent","urlEncode","replace","keys","values"],"mappings":"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","file":"objectarray.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4eee2cd4945eec5d67b2","/**\n* @file ObjectArray class declaration\n* @author Liqueur de Toile \n* @license Apache-2.0 {@link https://www.apache.org/licenses/LICENSE-2.0}\n*/\n\n/**\n* @classDesc\n* The ObjectArray class implements array-like properties and methods to\n* a key/value javascript object.\n* \n* It can be viewed as a kind of associative array in JS.\n*\n* @class ObjectArray\n* @since 1.0.0\n* @version 1.0.0\n* @author Liqueur de Toile \n*\n* @param {Object} data\n*\n* @returns {ObjectArray} ObjectArray object\n*/\n\nclass ObjectArray {\n constructor(data = {}) {\n /**\n * The inner data object\n *\n * @alias ObjectArray~_data\n * @private\n * @type {Object}\n * @since 1.0.0\n */\n this._data = {};\n this.import(data);\n }\n\n /**\n * Returns length of the ObjectArray\n *\n * @alias ObjectArray~length\n * @type Number\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @returns {Number} Length of the ObjectArray\n */\n get length() {\n return this.keys.length;\n }\n\n /**\n * Returns keys of the ObjectArray\n *\n * @alias ObjectArray~keys\n * @type Array\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @returns {Array} Array of ObjectArray keys\n */\n get keys() {\n let keys = [];\n\n for (let key in this._data) keys.push(key);\n return keys;\n }\n\n /**\n * Returns values of the ObjectArray\n *\n * @alias ObjectArray~values\n * @type Array\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @returns {Array} Array of ObjectArray values\n */\n get values() {\n let values = [];\n\n for (let key in this._data) values.push(this._data[key]);\n return values;\n }\n\n /**\n * Check if a given key exists in the ObjectArray\n *\n * @alias ObjectArray~has\n * @type Array\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {String} key Key\n * @returns {Array} Array of ObjectArray values\n */\n has(key) {\n let i, k, data = this._data;\n\n key = key.split('.');\n for (i = 0; i < key.length; i++) {\n k = key[i];\n if (typeof data[k] === 'undefined') return false;\n data = data[k];\n }\n return true;\n }\n\n /**\n * Returns dataset for the key. If no key is provided,\n * the whole data is returned\n *\n * @alias ObjectArray~data\n * @type Array\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {String} [key=null] Key\n * @returns {Array} Array of ObjectArray values\n */\n data(key = null) {\n let i, k, data = this._data;\n\n if (key !== null) {\n key = key.split('.');\n for (i = 0; i < key.length; i++) {\n k = key[i];\n if (typeof data[k] === 'undefined') return undefined;\n data = data[k];\n }\n }\n return data;\n }\n\n /**\n * Runs a callback on each ObjectArray entry\n *\n * @method ObjectArray~forEach\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {forEachCallback} cb Callback to be run\n * @param {String} [key=null] Dotted key to limit iterations through its subset\n * @returns {void}\n */\n forEach(cb, key = null) {\n let data = this.data(key);\n let index = 0;\n\n for (let key in data) cb.call(this, data[key], key, index++);\n }\n\n /**\n * Push a new key/value pair at the end of the ObjectArray\n *\n * @method ObjectArray~push\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {String} key Key of the added item\n * @param {Number|String|Array|Object} val Value of the added item\n * @returns {ObjectArray} Return self for chaining\n */\n push(key, val) {\n let path = this._data;\n\n key = key.split('.');\n key.forEach(function (k, i) {\n if (i < key.length - 1) {\n if (!path[k]) path[k] = {};\n path = path[k];\n } else path[k] = val;\n });\n return this;\n }\n\n /**\n * Remove key/value pair\n *\n * @method ObjectArray~remove\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {String} key Key of the added item\n * @returns {ObjectArray} Return self for chaining\n */\n remove(key) {\n let path = this._data;\n\n key = key.split('.');\n key.forEach(function (k, i) {\n if (i < key.length - 1) {\n if (!path[k]) path[k] = {};\n path = path[k];\n } else delete path[k];\n });\n return this;\n }\n\n /**\n * Import an object as data into the ObjectArray\n *\n * @method ObjectArray~import\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {Object} Data Object to import\n * @returns {ObjectArray} Return self for chaining\n */\n import(data) {\n for (let key in data) this.push(key, data[key]);\n return this;\n }\n\n /**\n * Reduce the ObjectArray data given a callback\n *\n * @method ObjectArray~reduce\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {Callback} reducer Callback to apply to each key/value (from left)\n * @param {Mixed} [start] Initial value for iteration\n * @returns {Mixed} Callback returns value\n */\n reduce(reducer, start) {\n var acc = start;\n\n this.forEach(function (value, key) { acc = reducer(acc, value, key); });\n return acc;\n }\n\n /**\n * Returns a string suitable for a style attribute.\n *\n * @method ObjectArray~styleString\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @returns {String} style string\n */\n styleString() {\n let ret = this.reduce(function (str, value, key) {\n str += key + ':' + value + ';';\n return str;\n }, '');\n\n return ret.substr(0, ret.length - 1);\n }\n\n urlEncode() {\n let ret = this.reduce(function (str, value, key) {\n str += key + '=' + encodeURIComponent(value) + '&';\n return str;\n }, '');\n\n return ret.substr(0, ret.length - 1);\n }\n\n formUrlEncode() {\n let ret = this.urlEncode();\n\n return ret.replace('%20', '+');\n }\n}\n\nexport default ObjectArray;\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap d81e8e176c82792c4b43","webpack:///./src/index.js"],"names":["ObjectArray","data","_data","import","pKey","keys","undefined","length","dataset","key","push","values","i","k","split","pop","join","val","forEach","parentKey","replace","cb","index","call","reducer","start","acc","value","ret","reduce","str","substr","encodeURIComponent","urlEncode","window"],"mappings":"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","file":"objectarray.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d81e8e176c82792c4b43","/**\n* @file ObjectArray class declaration\n* @author Liqueur de Toile \n* @license MIT {@link https://choosealicense.com/licenses/mit/}\n* @see [Github]{@link https://github.com/liqueurdetoile/objectarray}\n* @see [Author website]{@link https://liqueurdetoile.com}\n*/\n\n/**\n* @classDesc\n* The ObjectArray class implements array-like properties and methods to a key/value javascript object.*\n* It can be viewed as a kind of associative array in JS but it also\n* supports dot notation keys.\n*\n* @class ObjectArray\n* @since 1.0.0\n* @version 1.0.0\n* @author Liqueur de Toile \n* @license MIT {@link https://choosealicense.com/licenses/mit/}\n* @see [Github]{@link https://github.com/liqueurdetoile/objectarray}\n* @see [Author website]{@link https://liqueurdetoile.com}\n*\n* @param {Object} data Initial data to push into the ObjectArray\n*\n* @returns {ObjectArray} ObjectArray object\n* @description\n* The constructor is straight-forward. It can be provided with an existent object\n*/\n\nexport default class ObjectArray {\n constructor(data = {}) {\n /**\n * The inner data object\n *\n * @alias ObjectArray~_data\n * @private\n * @type {Object}\n * @since 1.0.0\n */\n this._data = {};\n this.import(data);\n }\n\n /**\n * Getter/setter for the root data of ObjectArray.\n *\n * @alias ObjectArray~data\n * @type Object\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n */\n get data() {\n return this._data;\n }\n\n set data(data) {\n this.import(data);\n }\n\n /**\n * Returns length of a given dataset in the ObjectArray\n * If no parent key is provided, it will output the length of\n * the root data object\n *\n * @method ObjectArray~length\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} pKey Parent key\n * @returns {Number|undefined} Length of the dataset or undefined if key doesn't exist\n */\n length(pKey) {\n let data = this.keys(pKey);\n\n if (!data) return undefined;\n return this.keys(pKey).length;\n }\n\n /**\n * Returns keys of a given dataset in the ObjectArray\n * If no parent key is provided, it will output the keys of\n * the root data object\n *\n * @method ObjectArray~keys\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} pKey Parent key\n * @returns {Array|undefined} Array of keys for the dataset\n * or undefined if key doesn't exist\n */\n keys(pKey) {\n let keys = [], data = this.dataset(pKey);\n\n if (!data) return undefined;\n for (let key in data) keys.push(key);\n return keys;\n }\n\n /**\n * Returns values of a given dataset in the ObjectArray\n * If no parent key is provided, it will output the keys of\n * the root data object\n *\n * @method ObjectArray~values\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} pKey Parent key\n * @returns {Array|undefined} Array of values for the dataset\n * or undefined if key doesn't exist\n */\n values(pKey) {\n let values = [], data = this.dataset(pKey);\n\n if (!data) return undefined;\n for (let key in data) values.push(data[key]);\n return values;\n }\n\n /**\n * Check if a given key exists in the ObjectArray\n *\n * @alias ObjectArray~has\n * @type Array\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} key Key\n * @returns {Boolean} true if key exists, false otherwise\n */\n has(key) {\n let i, k, data = this.data;\n\n key = key.split('.');\n for (i = 0; i < key.length; i++) {\n k = key[i];\n\n if (typeof data[k] === 'undefined') return false;\n data = data[k];\n }\n return true;\n }\n\n /**\n * Returns dataset for the key. If no key is provided,\n * the whole data is returned\n *\n * @alias ObjectArray~dataset\n * @type Object\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} [key=null] Key\n * @returns {Object|undefined} Data object or undefined if key doesn't exist\n */\n dataset(key) {\n let i, k, data = this.data;\n\n if (key !== undefined) {\n key = key.split('.');\n for (i = 0; i < key.length; i++) {\n k = key[i];\n\n if (typeof data[k] === 'undefined') return undefined;\n data = data[k];\n }\n }\n return data;\n }\n\n /**\n * Returns the parent key for a given key\n *\n * @alias ObjectArray~parentKey\n * @type Array\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} key Key\n * @returns {String} Parent key\n */\n parentKey(key) {\n if (typeof key !== undefined) {\n key = key.split('.');\n key.pop();\n\n if (key.length) {\n key = key.join('.');\n return key;\n }\n }\n return undefined;\n }\n\n /**\n * Push a new key/value pair\n *\n * @method ObjectArray~push\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} key Key of the added item\n * @param {Number|String|Array|Object} val Value of the added item\n * @param {dottedKey} [pKey] Parent key to push into\n * @returns {ObjectArray} Return self for chaining\n */\n push(key, val, pKey) {\n let k, data = this.dataset(pKey);\n\n key = key.split('.');\n k = key.pop();\n key.forEach(function (k, i) {\n if (typeof data[k] === 'undefined') data[k] = {};\n data = data[k];\n });\n data[k] = val;\n return this;\n }\n\n /**\n * Remove key/value pair\n *\n * @method ObjectArray~remove\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} key Key of the added item\n * @returns {ObjectArray} Return self for chaining\n */\n remove(key) {\n let pKey = this.parentKey(key);\n let data = this.dataset(pKey);\n\n if (data) {\n key = key.replace(pKey + '.', '');\n delete data[key];\n }\n return this;\n }\n\n /**\n * Import an object as data into the ObjectArray\n *\n * @method ObjectArray~import\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {Object} Data Object to import\n * @param {dottedKey} [pKey] Dotted parent key to import into\n * @returns {ObjectArray} Return self for chaining\n */\n import(data, pKey) {\n for (let key in data) this.push(key, data[key], pKey);\n return this;\n }\n\n /**\n * Runs a callback on each ObjectArray entry\n *\n * @method ObjectArray~forEach\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {forEachCallback} cb Callback to be run\n * @param {dottedKey} [key] Dotted key to limit iterations through its subset\n * if empty, the global data object will be used\n * @returns {void}\n */\n forEach(cb, key) {\n let data = this.dataset(key);\n let index = 0;\n\n for (let key in data) cb.call(this, data[key], key, index++);\n }\n\n /**\n * Reduce the ObjectArray data given a callback\n *\n * @method ObjectArray~reduce\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {Callback} reducer Callback to apply to each key/value (from left)\n * @param {Mixed} [start] Initial value for iteration\n * @param {dottedKey} [key] Dotted key to limit iterations through its subset\n * if empty, the global data object will be used\n * @returns {Mixed} Callback returns value\n */\n reduce(reducer, start, key) {\n var acc = start;\n\n this.forEach(function (value, k) { acc = reducer(acc, value, k); }, key);\n return acc;\n }\n\n /**\n * Returns a string suitable for a style attribute.\n *\n * @method ObjectArray~styleString\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} [key] Dotted key to limit iterations through its subset\n * if empty, the global data object will be used\n * @returns {String} style string\n */\n styleString(key) {\n let ret = this.reduce(function (str, value, k) {\n str += k + ':' + value + ';';\n return str;\n }, '', key);\n\n return ret.substr(0, ret.length - 1);\n }\n\n /**\n * Returns a string suitable for a URI query string\n *\n * @method ObjectArray~urlEncode\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} [key] Dotted key to limit iterations through its subset\n * if empty, the global data object will be used\n * @returns {String} style string\n */\n urlEncode(key) {\n let ret = this.reduce(function (str, value, key) {\n str += key + '=' + encodeURIComponent(value) + '&';\n return str;\n }, '', key);\n\n return ret.substr(0, ret.length - 1);\n }\n\n /**\n * Returns a string suitable for a form-url-encoded query string\n *\n * @method ObjectArray~formUrlEncode\n * @since 1.0.0\n * @version 1.0.0\n * @author Liqueur de Toile \n *\n * @param {dottedKey} [key] Dotted key to limit iterations through its subset\n * if empty, the global data object will be used\n * @returns {String} style string\n */\n formUrlEncode(key) {\n let ret = this.urlEncode(key);\n\n return ret.replace('%20', '+');\n }\n}\n\nif (window) window.ObjectArray = ObjectArray;\n\n/**\n* @typedef dottedKey\n* @type String\n* @description\n* A dotted key is useful to quickly access a subset of data\n* stored into the ObjectArray as if it was still a\n* vanilla Object.\n* @example\n* // Create an ObjectArray with subdata\n* var oa = new ObjectArray({\n* set1: {\n* subset1: 'foo',\n* subset2: {\n* subsub1: 'bar',\n* subsub2: 'baz'\n* }\n* }\n* });\n* // 'set1.subset1' will yield to 'foo'\n* // 'set1.subset1.subsub2' will yield to 'baz'\n*\n*/\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/objectarray.min.js b/dist/objectarray.min.js index 2523ba3..d88ed35 100644 --- a/dist/objectarray.min.js +++ b/dist/objectarray.min.js @@ -1 +1 @@ -!function(t){function e(r){if(n[r])return n[r].exports;var u=n[r]={i:r,l:!1,exports:{}};return t[r].call(u.exports,u,u.exports,e),u.l=!0,u.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=0)}([function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var u=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};r(this,t),this._data={},this.import(e)}return u(t,[{key:"has",value:function(t){var e=void 0,n=void 0,r=this._data;for(t=t.split("."),e=0;e0&&void 0!==arguments[0]?arguments[0]:null,e=void 0,n=void 0,r=this._data;if(null!==t)for(t=t.split("."),e=0;e1&&void 0!==arguments[1]?arguments[1]:null,n=this.data(e),r=0;for(var u in n)t.call(this,n[u],u,r++)}},{key:"push",value:function(t,e){var n=this._data;return t=t.split("."),t.forEach(function(r,u){u0&&void 0!==arguments[0]?arguments[0]:{};r(this,e),this._data={},this.import(t)}return i(e,[{key:"length",value:function(e){if(this.keys(e))return this.keys(e).length}},{key:"keys",value:function(e){var t=[],n=this.dataset(e);if(n){for(var r in n)t.push(r);return t}}},{key:"values",value:function(e){var t=[],n=this.dataset(e);if(n){for(var r in n)t.push(n[r]);return t}}},{key:"has",value:function(e){var t=void 0,n=void 0,r=this.data;for(e=e.split("."),t=0;t