From c91c817ad03c1eab1a2a5e04d911a287e64f3eaf Mon Sep 17 00:00:00 2001 From: khalilrached Date: Tue, 23 Apr 2024 22:50:09 +0100 Subject: [PATCH] pass current depth to transform function. --- README.md | 28 ++++++++++++++++++++++++++++ index.d.ts | 2 +- index.js | 4 ++-- test/test.js | 22 ++++++++++++++++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 325581c..6b5b0f6 100644 --- a/README.md +++ b/README.md @@ -207,6 +207,34 @@ unflatten({ // } ``` +### transformKey with currentDepth + +Transform each part of a flat key before and after flattening with condition of the current depth . + +```javascript +import { flatten, unflatten } from 'flat' + +flatten({ + key1: { + keyA: 'valueI' + }, + key2: { + keyB: 'valueII' + }, + key3: { a: { b: { c: 2 } } } +}, { + transformKey: function(key, depth){ + return depth > 2 ? '[' + key + ']' : key; + } +}) + +// { +// 'key1.keyA': 'valueI', +// 'key2.keyB': 'valueII', +// 'key3.a.[b].[c]': 2 +// } +``` + ## Command Line Usage `flat` is also available as a command line tool. You can run it with [`npx`](https://docs.npmjs.com/cli/v8/commands/npx): diff --git a/index.d.ts b/index.d.ts index 1442ce4..9ed1c47 100644 --- a/index.d.ts +++ b/index.d.ts @@ -2,7 +2,7 @@ export interface FlattenOptions { delimiter?: string; maxDepth?: number; safe?: boolean; - transformKey?: (key: string) => string; + transformKey?: (key: string, currentDepth?: number) => string; } export function flatten(target: T, options?: FlattenOptions): R; diff --git a/index.js b/index.js index 42e1ddc..ae77aa7 100644 --- a/index.js +++ b/index.js @@ -30,8 +30,8 @@ export function flatten (target, opts) { ) const newKey = prev - ? prev + delimiter + transformKey(key) - : transformKey(key) + ? prev + delimiter + transformKey(key, currentDepth) + : transformKey(key, currentDepth) if (!isarray && !isbuffer && isobject && Object.keys(value).length && (!opts.maxDepth || currentDepth < maxDepth)) { diff --git a/test/test.js b/test/test.js index ef01c9b..800f7a4 100644 --- a/test/test.js +++ b/test/test.js @@ -194,6 +194,28 @@ describe('Flatten', function () { '__lorem__.__ipsum__.__dolor__': 'good evening' }) }) + + test('Transformed Keys with current depth', function () { + assert.deepStrictEqual(flatten({ + hello: { + world: { + again: 'good morning' + } + }, + lorem: { + ipsum: { + dolor: 'good evening' + } + } + }, { + transformKey: function (key, depth) { + return depth > 2 ? '[' + key + ']' : key + } + }), { + 'hello.world.[again]': 'good morning', + 'lorem.ipsum.[dolor]': 'good evening' + }) + }) test('Should keep number in the left when object', function () { assert.deepStrictEqual(flatten({