diff --git a/README.md b/README.md index 9678954..03dd5a0 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ That is, where `obj` is equivalent to: flat = DataObjectParser.untranspose(structured) - structured = DataObjectParser.transpose(flat) + structured = DataObjectParser.transpose(flat, [options] /*default: {transposeNumAsArray : false}*/) Where the equivalent results would be: diff --git a/lib/utils/dataobject-parser.js b/lib/utils/dataobject-parser.js index 57735fc..efd3b46 100644 --- a/lib/utils/dataobject-parser.js +++ b/lib/utils/dataobject-parser.js @@ -39,8 +39,10 @@ function _isDate(value) { return value instanceof Date; } -function DataObjectParser($data){ +function DataObjectParser($data, options){ this._data = $data || {}; + options = options || {}; + this._numbersAreArrays = !!options.transposeNumAsArray; } /** @@ -69,6 +71,14 @@ DataObjectParser.prototype.set = function($path, $value) { $obj[$key] = $data; } }; + + var isTreatLikeArray = function(key) { + if(_isNumber(key)) { + return this._numbersAreArrays; + } + + return key === "[]"; + } while(pathList.length > 0) { parentKey = pathList.shift().replace(/["']/g, ''); @@ -78,8 +88,8 @@ DataObjectParser.prototype.set = function($path, $value) { throw new Error('Prototype pollution attempt detected'); } - // Number, treat it as an array - if (!isNaN(+parentKey) || parentKey === "[]") { + // Number, check whether to treat as Array + if (isTreatLikeArray(parentKey)) { if(!_isArray(parent) /* prevent overwritting */ ) { parent = []; addObj(grandParent, grandParentKey, parent);