From 0026a1d1e76213a7de3a802b1572ed84aafe49c0 Mon Sep 17 00:00:00 2001 From: olegP Date: Sun, 11 Feb 2024 11:56:58 +0000 Subject: [PATCH 1/4] added unflattenObject function --- src/array/transform.ts | 41 +++++++++++++++++++++++++++++++++++++++++ src/data-pipe.ts | 9 +++++++-- src/tests/array.spec.ts | 9 +++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/array/transform.ts b/src/array/transform.ts index 0374ac6..4965562 100644 --- a/src/array/transform.ts +++ b/src/array/transform.ts @@ -53,6 +53,47 @@ export function distinct(array: any[], elementSelector?: Selector): any[] { * @param data * @returns */ + +export function unflattenObject(data: any): any { + + + function setProperty(data: any, pName: string, value: any) { + const pNames = pName.split('.') + let parent: any = data + /** + data['p1'] = {} + parent = data.p1 + parent['p2'] = 123 + */ + + for (let i = 0; i < pNames.length - 1; i++) { + if (pNames[i] in parent) { + parent = parent[pNames[i]] + } else { + parent[pNames[i]] = {} + parent = parent[pNames[i]] + } + } + parent[pNames[pNames.length - 1]] = value + } + + if (Array.isArray(data)) { + const arr = []; + for (let i = 0; i < data.length; i++) { + const obj = unflattenObject(data[i]); + arr.push(obj); + } + return arr; + } else { + let obj: any = {} + const keys = Object.keys(data); + for (let i = 0; i < keys.length; i++) { + setProperty(obj, keys[i], data[keys[i]]) + } + return obj + } +} + export function flattenObject(data: any): any { if (!data || typeof data !== 'object') { return data; diff --git a/src/data-pipe.ts b/src/data-pipe.ts index c854e5d..462a41c 100644 --- a/src/data-pipe.ts +++ b/src/data-pipe.ts @@ -35,7 +35,8 @@ import { toObject, toSeries, flatten, - flattenObject + flattenObject, + unflattenObject } from './array'; export class DataPipe { @@ -304,7 +305,11 @@ export class DataPipe { return flattenObject(this.data); } - flattern(): any { + unflattenObject(): any { + return unflattenObject(this.data); + } + + flatten(): any { return flatten(this.data); } diff --git a/src/tests/array.spec.ts b/src/tests/array.spec.ts index ab4eb2d..342951a 100644 --- a/src/tests/array.spec.ts +++ b/src/tests/array.spec.ts @@ -131,6 +131,15 @@ describe('Test array methods', () => { expect(Object.keys(flatten[0]).join(',')).toBe('a,d.d1,d.d2'); }); + it('unflattenObject', () => { + const testArray = [{"a": 1, "b.e": 2,"b.c.d": 2,"b.c.f": 3,"b.f": 5},{"a": -1, "b.e": -2,"b.c.d": -2,"b.c.f": -3,"b.f": -5}]; + const unflatten = pipeFuncs.unflattenObject(testArray); + expect(unflatten.length).toBe(2); + expect(Object.keys(unflatten[0]).join(',')).toBe('a,b'); + expect(unflatten[0].b.c['d']).toBe(2); + expect(unflatten[1].b.c['d']).toBe(-2); + }); + it('countBy', () => { const countriesCount = pipeFuncs.countBy(data, i => i.country); expect(countriesCount['US']).toBe(3); From c4f15fc2e3a7a48f5a58ff8d003e86cfbfd23bee Mon Sep 17 00:00:00 2001 From: olegP Date: Sun, 11 Feb 2024 12:24:00 +0000 Subject: [PATCH 2/4] maybe i shouldnt touch that --- src/array/transform.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/array/transform.ts b/src/array/transform.ts index 4965562..3bd946c 100644 --- a/src/array/transform.ts +++ b/src/array/transform.ts @@ -57,7 +57,7 @@ export function distinct(array: any[], elementSelector?: Selector): any[] { export function unflattenObject(data: any): any { - function setProperty(data: any, pName: string, value: any) { + function setProperty(data: any, pName: string, value: any): any { const pNames = pName.split('.') let parent: any = data /** @@ -85,7 +85,7 @@ export function unflattenObject(data: any): any { } return arr; } else { - let obj: any = {} + const obj: any = {} const keys = Object.keys(data); for (let i = 0; i < keys.length; i++) { setProperty(obj, keys[i], data[keys[i]]) From 53a801e53131e817defcc134f6a29ce8ea333d6c Mon Sep 17 00:00:00 2001 From: olegP Date: Sun, 11 Feb 2024 12:28:35 +0000 Subject: [PATCH 3/4] cleaning up --- src/data-pipe.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data-pipe.ts b/src/data-pipe.ts index 462a41c..b07a414 100644 --- a/src/data-pipe.ts +++ b/src/data-pipe.ts @@ -309,7 +309,7 @@ export class DataPipe { return unflattenObject(this.data); } - flatten(): any { + flattern(): any { return flatten(this.data); } From 676bea4e4453bd2f337334cb593b219441d45012 Mon Sep 17 00:00:00 2001 From: olegP Date: Sun, 11 Feb 2024 13:44:55 +0000 Subject: [PATCH 4/4] updated readme, removed unused code, fixed flatteRn typo --- README.md | 2 ++ src/array/transform.ts | 5 ----- src/data-pipe.ts | 2 +- src/tests/array.spec.ts | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index dcff29d..375d44d 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,8 @@ Loading and parsing data from a common file formats like: CSV, JSON, TSV either - [**pivot**](https://www.datapipe-js.com/docs/datapipe-js-array#pivot) (array, rowFields, columnField, dataField, aggFunction?, columnValues?) - Returns a reshaped (pivoted) array based on unique column values. - [**transpose**](https://www.datapipe-js.com/docs/datapipe-js-array#transpose) (array) - Transpose rows to columns in an array - [**sort**](https://www.datapipe-js.com/docs/datapipe-js-array#sort) ([fieldName(s)]) - Sort array of elements according to a field and direction specified. e.g. sort(array, 'name ASC', 'age DESC') + - [**flattenObject**](https://www.datapipe-js.com/docs/datapipe-js-array#flattenObject) (Object) - flattens complex nested object into simple object. e.g. flattenObject(obj) + - [**unflattenObject**](https://www.datapipe-js.com/docs/datapipe-js-array#unflattenObject) (Object) - unflattens simple object into complex nested object. e.g. unflattenObject(obj) ### Joining data arrays diff --git a/src/array/transform.ts b/src/array/transform.ts index 3bd946c..039e9f0 100644 --- a/src/array/transform.ts +++ b/src/array/transform.ts @@ -60,11 +60,6 @@ export function unflattenObject(data: any): any { function setProperty(data: any, pName: string, value: any): any { const pNames = pName.split('.') let parent: any = data - /** - data['p1'] = {} - parent = data.p1 - parent['p2'] = 123 - */ for (let i = 0; i < pNames.length - 1; i++) { if (pNames[i] in parent) { diff --git a/src/data-pipe.ts b/src/data-pipe.ts index b07a414..462a41c 100644 --- a/src/data-pipe.ts +++ b/src/data-pipe.ts @@ -309,7 +309,7 @@ export class DataPipe { return unflattenObject(this.data); } - flattern(): any { + flatten(): any { return flatten(this.data); } diff --git a/src/tests/array.spec.ts b/src/tests/array.spec.ts index 342951a..5f4dc5b 100644 --- a/src/tests/array.spec.ts +++ b/src/tests/array.spec.ts @@ -114,7 +114,7 @@ describe('Test array methods', () => { expect(groups.length).toBe(3); }); - it('flattern', () => { + it('flatten', () => { const testArray = [1, 4, [2, [5, 5, [9, 7]], 11], 0, [], []]; const flatten = pipeFuncs.flatten(testArray); expect(flatten.length).toBe(9);