diff --git a/README.md b/README.md index a036a9f..55e2c8f 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,30 @@ unflatten({ // } ``` +### arrayBrackets + +When enabled, array children will be wrapped in brackets: + +``` javascript +flatten({ + arr: [ + 'a', + 'b' + ], + arr2: [ + { + keyB: 'valueII' + } + ] +}, { arrayBrackets: true }) + +// { +// 'arr[0]': 'a', +// 'arr[1]': 'b', +// 'arr2[0].keyB': 'valueII' +// } +``` + ### overwrite When enabled, existing keys in the unflattened object may be overwritten if they cannot hold a newly encountered nested value: diff --git a/index.js b/index.js index 2a5d7ca..2a644d7 100644 --- a/index.js +++ b/index.js @@ -19,9 +19,10 @@ function flatten (target, opts) { const delimiter = opts.delimiter || '.' const maxDepth = opts.maxDepth const transformKey = opts.transformKey || keyIdentity + const arrayBrackets = opts.arrayBrackets || false const output = {} - function step (object, prev, currentDepth) { + function step (object, prev, currentDepth, addbrackets) { currentDepth = currentDepth || 1 Object.keys(object).forEach(function (key) { const value = object[key] @@ -32,14 +33,22 @@ function flatten (target, opts) { type === '[object Object]' || type === '[object Array]' ) - - const newKey = prev - ? prev + delimiter + transformKey(key) - : transformKey(key) + const childhasbrackets = arrayBrackets && Array.isArray(value) + + let newKey + if (addbrackets) { + newKey = prev + ? prev + '[' + transformKey(key) + ']' + : '[' + transformKey(key) + ']' + } else { + newKey = prev + ? prev + delimiter + transformKey(key) + : transformKey(key) + } if (!isarray && !isbuffer && isobject && Object.keys(value).length && (!opts.maxDepth || currentDepth < maxDepth)) { - return step(value, newKey, currentDepth + 1) + return step(value, newKey, currentDepth + 1, childhasbrackets) } output[newKey] = value diff --git a/package-lock.json b/package-lock.json index 43b19f3..83ac451 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "flat", - "version": "5.0.1", + "version": "5.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/test/test.js b/test/test.js index 7f4ee3d..ec2a432 100644 --- a/test/test.js +++ b/test/test.js @@ -109,6 +109,26 @@ suite('Flatten', function () { }) }) + test('Array Brackets', function () { + assert.deepStrictEqual(flatten({ + hello: [ + { + world: { + again: 'good morning' + } + } + ], + arr: [1, 2, 3] + }, { + arrayBrackets: true + }), { + 'hello[0].world.again': 'good morning', + 'arr[0]': 1, + 'arr[1]': 2, + 'arr[2]': 3 + }) + }) + test('Empty Objects', function () { assert.deepStrictEqual(flatten({ hello: {