From b4d73ef42db676dd2dfcca4f97360a99936360d0 Mon Sep 17 00:00:00 2001 From: Greg Forel Date: Sat, 11 Apr 2020 10:26:21 +0200 Subject: [PATCH 1/7] done --- build/arrayToTree.js | 16 +- build/arrayToTree.js.map | 2 +- build/arrayToTree.min.js | 2 +- build/arrayToTree.spec.js | 249 +++++++++------ build/arrayToTree.spec.js.map | 2 +- src/arrayToTree.spec.ts | 584 +++++++++++++++++++--------------- src/arrayToTree.ts | 183 ++++++----- 7 files changed, 604 insertions(+), 434 deletions(-) diff --git a/build/arrayToTree.js b/build/arrayToTree.js index 6fbd043..3ab78fd 100644 --- a/build/arrayToTree.js +++ b/build/arrayToTree.js @@ -16,7 +16,7 @@ var defaultConfig = { parentId: 'parentId', dataField: 'data', childrenField: 'children', - throwIfOrphans: false, + throwIfOrphans: false }; /** * Unflattens an array to a tree with runtime O(n) @@ -39,8 +39,8 @@ function arrayToTree(items, config) { // if an item has no parentId, add it as a root element to rootItems for (var _i = 0, items_1 = items; _i < items_1.length; _i++) { var item = items_1[_i]; - var itemId = item[conf.id]; - var parentId = item[conf.parentId]; + var itemId = getNestedProperty(item, conf.id); + var parentId = getNestedProperty(item, conf.parentId); // look whether item already exists in the lookup table if (!Object.prototype.hasOwnProperty.call(lookup, itemId)) { // item is not yet there, so add a preliminary item (its data will be added later) @@ -85,4 +85,14 @@ function arrayToTree(items, config) { return rootItems; } exports.arrayToTree = arrayToTree; +/** + * Returns the value of a nested property inside an item + * Example: user can access 'id', or 'parentId' inside item = { nestedObject: { id: 'myId', parentId: 'myParentId' } } + * using getNestedItemProperty(item, 'nestedObject.id') or getNestedItemProperty(item, 'nestedObject.parentId') + * @param item + * @param nestedProperty the chained properties to access the nested property. Eg: 'your.nested.property' + */ +var getNestedProperty = function (item, nestedProperty) { + return nestedProperty.split('.').reduce(function (o, i) { return o[i]; }, item); +}; //# sourceMappingURL=arrayToTree.js.map \ No newline at end of file diff --git a/build/arrayToTree.js.map b/build/arrayToTree.js.map index c43ae8b..109eba0 100644 --- a/build/arrayToTree.js.map +++ b/build/arrayToTree.js.map @@ -1 +1 @@ -{"version":3,"file":"arrayToTree.js","sourceRoot":"","sources":["../src/arrayToTree.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAoBA,IAAM,aAAa,GAAW;IAC5B,EAAE,EAAE,IAAI;IACR,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,MAAM;IACjB,aAAa,EAAE,UAAU;IACzB,cAAc,EAAE,KAAK;CACtB,CAAA;AAED;;GAEG;AACH,SAAgB,WAAW,CAAE,KAAa,EAAE,MAA4B;;IAA5B,uBAAA,EAAA,WAA4B;;IACtE,IAAM,IAAI,yBAAgB,aAAa,GAAK,MAAM,CAAE,CAAA;IAEpD,iCAAiC;IACjC,IAAM,SAAS,GAAe,EAAE,CAAA;IAEhC,yFAAyF;IACzF,IAAM,MAAM,GAA+B,EAAE,CAAA;IAE7C,qFAAqF;IACrF,qEAAqE;IACrE,IAAM,SAAS,GAAgC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IAEvF,qBAAqB;IACrB,+GAA+G;IAC/G,qEAAqE;IACrE,oEAAoE;IACpE,KAAmB,UAAK,EAAL,eAAK,EAAL,mBAAK,EAAL,IAAK,EAAE;QAArB,IAAM,IAAI,cAAA;QACb,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC5B,IAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAEpC,uDAAuD;QACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;YACzD,kFAAkF;YAClF,MAAM,CAAC,MAAM,CAAC,aAAK,GAAC,IAAI,CAAC,aAAa,IAAG,EAAE,KAAE,CAAA;SAC9C;QAED,2EAA2E;QAC3E,IAAI,SAAS,EAAE;YAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;SAAE;QAE3C,8DAA8D;QAC9D,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAA;SACtC;aAAM;YACL,MAAM,CAAC,MAAM,CAAC,yBAAQ,IAAI,gBAAG,IAAI,CAAC,aAAa,IAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,MAAE,CAAA;SACvF;QAED,IAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;QAE/B,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE;YAClE,iBAAiB;YACjB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;SACzB;aAAM;YACL,eAAe;YAEf,6DAA6D;YAC7D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;gBAC3D,sFAAsF;gBACtF,MAAM,CAAC,QAAQ,CAAC,aAAK,GAAC,IAAI,CAAC,aAAa,IAAG,EAAE,KAAE,CAAA;gBAE/C,mEAAmE;gBACnE,IAAI,SAAS,EAAE;oBAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;iBAAE;aAC3C;YAED,qCAAqC;YACrC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;SACpD;KACF;IAED,UAAI,SAAS,0CAAE,IAAI,EAAE;QACnB,MAAM,IAAI,KAAK,CAAC,0EAA0E;aACxF,MAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,yFAAsF,CAAA;YAC/G,wEAAwE,CAAC,CAAA;KAC5E;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAlED,kCAkEC"} \ No newline at end of file +{"version":3,"file":"arrayToTree.js","sourceRoot":"","sources":["../src/arrayToTree.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/arrayToTree.min.js b/build/arrayToTree.min.js index 5e272f2..cef248e 100644 --- a/build/arrayToTree.min.js +++ b/build/arrayToTree.min.js @@ -1 +1 @@ -"use strict";var __assign=this&&this.__assign||function(){return(__assign=Object.assign||function(r){for(var e,t=1,a=arguments.length;t { - it('should work with nested objects', () => { - expect(arrayToTree([ - { id: '4', parentId: null, custom: 'abc' }, - { id: '31', parentId: '4', custom: '12' }, - { id: '1941', parentId: '418', custom: 'de' }, - { id: '1', parentId: '418', custom: 'ZZZz' }, - { id: '418', parentId: null, custom: 'ü' }, - ])).to.deep.equal([ - { - data: { id: '4', parentId: null, custom: 'abc' }, children: [ - { data: { id: '31', parentId: '4', custom: '12' }, children: [] }, - ], - }, - { - data: { id: '418', parentId: null, custom: 'ü' }, children: [ - { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, - { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, - ], - }, - ]) - }) + it('should work with nested objects', () => { + expect( + arrayToTree([ + { id: '4', parentId: null, custom: 'abc' }, + { id: '31', parentId: '4', custom: '12' }, + { id: '1941', parentId: '418', custom: 'de' }, + { id: '1', parentId: '418', custom: 'ZZZz' }, + { id: '418', parentId: null, custom: 'ü' } + ]) + ).to.deep.equal([ + { + data: { id: '4', parentId: null, custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ] + }, + { + data: { id: '418', parentId: null, custom: 'ü' }, + children: [ + { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, + { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] } + ] + } + ]) + }) - it('should work with integer keys', () => { - expect(arrayToTree([ - { id: 4, parentId: null, custom: 'abc' }, - { id: 31, parentId: 4, custom: '12' }, - { id: 1941, parentId: 418, custom: 'de' }, - { id: 1, parentId: 418, custom: 'ZZZz' }, - { id: 418, parentId: null, custom: 'ü' }, - ])).to.deep.equal([ - { - data: { id: 4, parentId: null, custom: 'abc' }, children: [ - { data: { id: 31, parentId: 4, custom: '12' }, children: [] }, - ], - }, - { - data: { id: 418, parentId: null, custom: 'ü' }, children: [ - { data: { id: 1941, parentId: 418, custom: 'de' }, children: [] }, - { data: { id: 1, parentId: 418, custom: 'ZZZz' }, children: [] }, - ], - }, - ]) - }) + it('should work with integer keys', () => { + expect( + arrayToTree([ + { id: 4, parentId: null, custom: 'abc' }, + { id: 31, parentId: 4, custom: '12' }, + { id: 1941, parentId: 418, custom: 'de' }, + { id: 1, parentId: 418, custom: 'ZZZz' }, + { id: 418, parentId: null, custom: 'ü' } + ]) + ).to.deep.equal([ + { + data: { id: 4, parentId: null, custom: 'abc' }, + children: [ { data: { id: 31, parentId: 4, custom: '12' }, children: [] } ] + }, + { + data: { id: 418, parentId: null, custom: 'ü' }, + children: [ + { data: { id: 1941, parentId: 418, custom: 'de' }, children: [] }, + { data: { id: 1, parentId: 418, custom: 'ZZZz' }, children: [] } + ] + } + ]) + }) - it('should work with nested objects and custom keys', () => { - expect(arrayToTree( - ([ - { num: '4', ref: null, custom: 'abc' }, - { num: '31', ref: '4', custom: '12' }, - { num: '1941', ref: '418', custom: 'de' }, - { num: '1', ref: '418', custom: 'ZZZz' }, - { num: '418', ref: null, custom: 'ü' }, - ]), - { id: 'num', parentId: 'ref', childrenField: 'nodes' }, - )).to.deep.equal([ - { - data: { num: '4', ref: null, custom: 'abc' }, nodes: [ - { data: { num: '31', ref: '4', custom: '12' }, nodes: [] }, - ], - }, - { - data: { num: '418', ref: null, custom: 'ü' }, nodes: [ - { data: { num: '1941', ref: '418', custom: 'de' }, nodes: [] }, - { data: { num: '1', ref: '418', custom: 'ZZZz' }, nodes: [] }, - ], - }, - ]) - }) + it('should work with nested objects and custom keys', () => { + expect( + arrayToTree( + [ + { num: '4', ref: null, custom: 'abc' }, + { num: '31', ref: '4', custom: '12' }, + { num: '1941', ref: '418', custom: 'de' }, + { num: '1', ref: '418', custom: 'ZZZz' }, + { num: '418', ref: null, custom: 'ü' } + ], + { id: 'num', parentId: 'ref', childrenField: 'nodes' } + ) + ).to.deep.equal([ + { + data: { num: '4', ref: null, custom: 'abc' }, + nodes: [ { data: { num: '31', ref: '4', custom: '12' }, nodes: [] } ] + }, + { + data: { num: '418', ref: null, custom: 'ü' }, + nodes: [ + { data: { num: '1941', ref: '418', custom: 'de' }, nodes: [] }, + { data: { num: '1', ref: '418', custom: 'ZZZz' }, nodes: [] } + ] + } + ]) + }) - it('should ignore objects if parentId does not exist', () => { - expect(arrayToTree([ - { id: '4', parentId: null, custom: 'abc' }, - { id: '31', parentId: '4', custom: '12' }, - { id: '1941', parentId: '418', custom: 'de' }, - { id: '1', parentId: '418', custom: 'ZZZz' }, - { id: '418', parentId: null, custom: 'ü' }, - { id: '1313', parentId: '13', custom: 'Not existing' }, - ])).to.deep.equal([ - { - data: { id: '4', parentId: null, custom: 'abc' }, children: [ - { data: { id: '31', parentId: '4', custom: '12' }, children: [] }, - ], - }, - { - data: { id: '418', parentId: null, custom: 'ü' }, children: [ - { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, - { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, - ], - }, - ]) - }) + it('should ignore objects if parentId does not exist', () => { + expect( + arrayToTree([ + { id: '4', parentId: null, custom: 'abc' }, + { id: '31', parentId: '4', custom: '12' }, + { id: '1941', parentId: '418', custom: 'de' }, + { id: '1', parentId: '418', custom: 'ZZZz' }, + { id: '418', parentId: null, custom: 'ü' }, + { id: '1313', parentId: '13', custom: 'Not existing' } + ]) + ).to.deep.equal([ + { + data: { id: '4', parentId: null, custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ] + }, + { + data: { id: '418', parentId: null, custom: 'ü' }, + children: [ + { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, + { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] } + ] + } + ]) + }) - it('should work with nested objects with dataField set to null', () => { - expect(arrayToTree( - ([ - { id: '4', parentId: null, custom: 'abc' }, - { id: '31', parentId: '4', custom: '12' }, - { id: '1941', parentId: '418', custom: 'de' }, - { id: '1', parentId: '418', custom: 'ZZZz' }, - { id: '418', parentId: null, custom: 'ü' }, - ]), - { dataField: null }, - )).to.deep.equal([ - { - id: '4', parentId: null, custom: 'abc', children: [ - { id: '31', parentId: '4', custom: '12', children: [] }, - ], - }, - { - id: '418', parentId: null, custom: 'ü', children: [ - { id: '1941', parentId: '418', custom: 'de', children: [] }, - { id: '1', parentId: '418', custom: 'ZZZz', children: [] }, - ], - }, - ]) - }) + it('should work with nested objects with dataField set to null', () => { + expect( + arrayToTree( + [ + { id: '4', parentId: null, custom: 'abc' }, + { id: '31', parentId: '4', custom: '12' }, + { id: '1941', parentId: '418', custom: 'de' }, + { id: '1', parentId: '418', custom: 'ZZZz' }, + { id: '418', parentId: null, custom: 'ü' } + ], + { dataField: null } + ) + ).to.deep.equal([ + { + id: '4', + parentId: null, + custom: 'abc', + children: [ { id: '31', parentId: '4', custom: '12', children: [] } ] + }, + { + id: '418', + parentId: null, + custom: 'ü', + children: [ + { id: '1941', parentId: '418', custom: 'de', children: [] }, + { id: '1', parentId: '418', custom: 'ZZZz', children: [] } + ] + } + ]) + }) - it('should work with nested objects and custom keys with dataField set to null', () => { - expect(arrayToTree( - ([ - { num: '4', ref: null, custom: 'abc' }, - { num: '31', ref: '4', custom: '12' }, - { num: '1941', ref: '418', custom: 'de' }, - { num: '1', ref: '418', custom: 'ZZZz' }, - { num: '418', ref: null, custom: 'ü' }, - ]), - { id: 'num', parentId: 'ref', dataField: null }, - )).to.deep.equal([ - { - num: '4', ref: null, custom: 'abc', children: [ - { num: '31', ref: '4', custom: '12', children: [] }, - ], - }, - { - num: '418', ref: null, custom: 'ü', children: [ - { num: '1941', ref: '418', custom: 'de', children: [] }, - { num: '1', ref: '418', custom: 'ZZZz', children: [] }, - ], - }, - ]) - }) + it('should work with nested objects and custom keys with dataField set to null', () => { + expect( + arrayToTree( + [ + { num: '4', ref: null, custom: 'abc' }, + { num: '31', ref: '4', custom: '12' }, + { num: '1941', ref: '418', custom: 'de' }, + { num: '1', ref: '418', custom: 'ZZZz' }, + { num: '418', ref: null, custom: 'ü' } + ], + { id: 'num', parentId: 'ref', dataField: null } + ) + ).to.deep.equal([ + { + num: '4', + ref: null, + custom: 'abc', + children: [ { num: '31', ref: '4', custom: '12', children: [] } ] + }, + { + num: '418', + ref: null, + custom: 'ü', + children: [ + { num: '1941', ref: '418', custom: 'de', children: [] }, + { num: '1', ref: '418', custom: 'ZZZz', children: [] } + ] + } + ]) + }) - it('should ignore objects if parentId does not exist with dataField set to null', () => { - expect(arrayToTree( - ([ - { id: '4', parentId: null, custom: 'abc' }, - { id: '31', parentId: '4', custom: '12' }, - { id: '1941', parentId: '418', custom: 'de' }, - { id: '1', parentId: '418', custom: 'ZZZz' }, - { id: '418', parentId: null, custom: 'ü' }, - { id: '1313', parentId: '13', custom: 'Not existing' }, - ]), - { dataField: null }, - )).to.deep.equal([ - { - id: '4', parentId: null, custom: 'abc', children: [ - { id: '31', parentId: '4', custom: '12', children: [] }, - ], - }, - { - id: '418', parentId: null, custom: 'ü', children: [ - { id: '1941', parentId: '418', custom: 'de', children: [] }, - { id: '1', parentId: '418', custom: 'ZZZz', children: [] }, - ], - }, - ]) - }) + it('should ignore objects if parentId does not exist with dataField set to null', () => { + expect( + arrayToTree( + [ + { id: '4', parentId: null, custom: 'abc' }, + { id: '31', parentId: '4', custom: '12' }, + { id: '1941', parentId: '418', custom: 'de' }, + { id: '1', parentId: '418', custom: 'ZZZz' }, + { id: '418', parentId: null, custom: 'ü' }, + { id: '1313', parentId: '13', custom: 'Not existing' } + ], + { dataField: null } + ) + ).to.deep.equal([ + { + id: '4', + parentId: null, + custom: 'abc', + children: [ { id: '31', parentId: '4', custom: '12', children: [] } ] + }, + { + id: '418', + parentId: null, + custom: 'ü', + children: [ + { id: '1941', parentId: '418', custom: 'de', children: [] }, + { id: '1', parentId: '418', custom: 'ZZZz', children: [] } + ] + } + ]) + }) - it('should treat objects with missing parentId as root objects', () => { - expect(arrayToTree([ - { id: '4', custom: 'abc' }, - { id: '31', parentId: '4', custom: '12' }, - { id: '1941', parentId: '418', custom: 'de' }, - { id: '1', parentId: '418', custom: 'ZZZz' }, - { id: '418', custom: 'ü' }, - { id: '1313', parentId: '13', custom: 'Not existing' }, - ])).to.deep.equal([ - { - data: { id: '4', custom: 'abc' }, children: [ - { data: { id: '31', parentId: '4', custom: '12' }, children: [] }, - ], - }, - { - data: { id: '418', custom: 'ü' }, children: [ - { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, - { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, - ], - }, - ]) - }) + it('should treat objects with missing parentId as root objects', () => { + expect( + arrayToTree([ + { id: '4', custom: 'abc' }, + { id: '31', parentId: '4', custom: '12' }, + { id: '1941', parentId: '418', custom: 'de' }, + { id: '1', parentId: '418', custom: 'ZZZz' }, + { id: '418', custom: 'ü' }, + { id: '1313', parentId: '13', custom: 'Not existing' } + ]) + ).to.deep.equal([ + { + data: { id: '4', custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ] + }, + { + data: { id: '418', custom: 'ü' }, + children: [ + { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, + { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] } + ] + } + ]) + }) - it('should treat objects with empty string as parentId as root objects', () => { - expect(arrayToTree([ - { id: '4', parentId: '', custom: 'abc' }, - { id: '31', parentId: '4', custom: '12' }, - { id: '1941', parentId: '418', custom: 'de' }, - { id: '1', parentId: '418', custom: 'ZZZz' }, - { id: '418', parentId: '', custom: 'ü' }, - { id: '1313', parentId: '13', custom: 'Not existing' }, - ])).to.deep.equal([ - { - data: { id: '4', parentId: '', custom: 'abc' }, children: [ - { data: { id: '31', parentId: '4', custom: '12' }, children: [] }, - ], - }, - { - data: { id: '418', parentId: '', custom: 'ü' }, children: [ - { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, - { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, - ], - }, - ]) - }) + it('should treat objects with empty string as parentId as root objects', () => { + expect( + arrayToTree([ + { id: '4', parentId: '', custom: 'abc' }, + { id: '31', parentId: '4', custom: '12' }, + { id: '1941', parentId: '418', custom: 'de' }, + { id: '1', parentId: '418', custom: 'ZZZz' }, + { id: '418', parentId: '', custom: 'ü' }, + { id: '1313', parentId: '13', custom: 'Not existing' } + ]) + ).to.deep.equal([ + { + data: { id: '4', parentId: '', custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ] + }, + { + data: { id: '418', parentId: '', custom: 'ü' }, + children: [ + { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, + { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] } + ] + } + ]) + }) - it('should not throw if orphans exist but throwIfOrphans is false', () => { - expect(arrayToTree([ - { id: '4', parentId: null, custom: 'abc' }, - { id: '31', parentId: '4', custom: '12' }, - { id: '418', parentId: '6', custom: 'ü' }, - ])).to.deep.equal([ - { - data: { id: '4', parentId: null, custom: 'abc' }, children: [ - { data: { id: '31', parentId: '4', custom: '12' }, children: [] }, - ], - }, - ]) - }) + it('should not throw if orphans exist but throwIfOrphans is false', () => { + expect( + arrayToTree([ + { id: '4', parentId: null, custom: 'abc' }, + { id: '31', parentId: '4', custom: '12' }, + { id: '418', parentId: '6', custom: 'ü' } + ]) + ).to.deep.equal([ + { + data: { id: '4', parentId: null, custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ] + } + ]) + }) - it('should throw if orphans exist and throwIfOrphans is true', () => { - expect(() => arrayToTree([ - { id: '4', parentId: null, custom: 'abc' }, - { id: '31', parentId: '4', custom: '12' }, - { id: '418', parentId: '6', custom: 'ü' }, - { id: '419', parentId: '418', custom: 'ü' }, - { id: '420', parentId: '7', custom: 'ü' }, - ], { throwIfOrphans: true })).to.throw( - 'The items array contains orphans that point to the following parentIds: [6,7]. ' + - 'These parentIds do not exist in the items array. ' + - 'Hint: prevent orphans to result in an error by passing the following option: { throwIfOrphans: false }') - }) + it('should throw if orphans exist and throwIfOrphans is true', () => { + expect(() => + arrayToTree( + [ + { id: '4', parentId: null, custom: 'abc' }, + { id: '31', parentId: '4', custom: '12' }, + { id: '418', parentId: '6', custom: 'ü' }, + { id: '419', parentId: '418', custom: 'ü' }, + { id: '420', parentId: '7', custom: 'ü' } + ], + { throwIfOrphans: true } + ) + ).to.throw( + 'The items array contains orphans that point to the following parentIds: [6,7]. ' + + 'These parentIds do not exist in the items array. ' + + 'Hint: prevent orphans to result in an error by passing the following option: { throwIfOrphans: false }' + ) + }) - it('should not throw if no orphans exist and throwIfOrphans is true, but the order is different (see #18)', () => { - expect(arrayToTree([ - { id: '2', parentId: 'root', foo: 'bar' }, - { id: '1-1', parentId: '1', foo: 'bar' }, - { id: '1', parentId: 'root', foo: 'bar' }, - { id: 'root', parentId: null, bar: 'bar' }, - ], { dataField: null, throwIfOrphans: true })).to.deep.equal([ - { id: 'root', parentId: null, bar: 'bar', children: [ - { id: '2', parentId: 'root', foo: 'bar', children: [] }, - { id: '1', parentId: 'root', foo: 'bar', children: [ - { id: '1-1', parentId: '1', foo: 'bar', children: [] }, - ]}, - ]}, - ]) - }) + it('should not throw if no orphans exist and throwIfOrphans is true, but the order is different (see #18)', () => { + expect( + arrayToTree( + [ + { id: '2', parentId: 'root', foo: 'bar' }, + { id: '1-1', parentId: '1', foo: 'bar' }, + { id: '1', parentId: 'root', foo: 'bar' }, + { id: 'root', parentId: null, bar: 'bar' } + ], + { dataField: null, throwIfOrphans: true } + ) + ).to.deep.equal([ + { + id: 'root', + parentId: null, + bar: 'bar', + children: [ + { id: '2', parentId: 'root', foo: 'bar', children: [] }, + { + id: '1', + parentId: 'root', + foo: 'bar', + children: [ { id: '1-1', parentId: '1', foo: 'bar', children: [] } ] + } + ] + } + ]) + }) - it('should work with empty inputs', () => { - expect(arrayToTree([])).to.deep.equal([]) - }) + it('should work with empty inputs', () => { + expect(arrayToTree([])).to.deep.equal([]) + }) + + it('should work with nested objects and nested id and/or parentId properties', () => { + expect( + arrayToTree( + [ + { nestedProperties: { id: '1', parentId: null, custom: '1' } }, + { nestedProperties: { id: '1.1', parentId: '1', custom: '1.1' } }, + { nestedProperties: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, + { nestedProperties: { id: '1.2', parentId: '1', custom: '1.2' } }, + { nestedProperties: { id: '2', parentId: null, custom: '2' } } + ], + { id: 'nestedProperties.id', parentId: 'nestedProperties.parentId' } + ) + ).to.deep.equal([ + { + data: { nestedProperties: { id: '1', parentId: null, custom: '1' } }, + children: [ + { + data: { nestedProperties: { id: '1.1', parentId: '1', custom: '1.1' } }, + children: [ + { + data: { nestedProperties: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, + children: [] + } + ] + }, + { + data: { nestedProperties: { id: '1.2', parentId: '1', custom: '1.2' } }, + children: [] + } + ] + }, + { + data: { nestedProperties: { id: '2', parentId: null, custom: '2' } }, + children: [] + } + ]) + }) }) diff --git a/src/arrayToTree.ts b/src/arrayToTree.ts index ef72c28..e959495 100644 --- a/src/arrayToTree.ts +++ b/src/arrayToTree.ts @@ -1,98 +1,117 @@ export interface Item { - id?: string | number - parentId?: string | number | null, - [key: string]: any, + id?: string | number + parentId?: string | number | null + [key: string]: any } export interface TreeItem { - id?: string | number, - parentId?: string | number | null, - [key: string]: Item | TreeItem[] | any, + id?: string | number + parentId?: string | number | null + [key: string]: Item | TreeItem[] | any } export interface Config { - id: string, - parentId: string, - dataField: string | null, - childrenField: string, - throwIfOrphans: boolean, + id: string + parentId: string + dataField: string | null + childrenField: string + throwIfOrphans: boolean } const defaultConfig: Config = { - id: 'id', - parentId: 'parentId', - dataField: 'data', - childrenField: 'children', - throwIfOrphans: false, + id: 'id', + parentId: 'parentId', + dataField: 'data', + childrenField: 'children', + throwIfOrphans: false } /** * Unflattens an array to a tree with runtime O(n) */ -export function arrayToTree (items: Item[], config: Partial = {}): TreeItem[] { - const conf: Config = { ...defaultConfig, ...config } - - // the resulting unflattened tree - const rootItems: TreeItem[] = [] - - // stores all already processed items with their ids as key so we can easily look them up - const lookup: { [id: string]: TreeItem } = {} - - // stores all item ids that have not been added to the resulting unflattened tree yet - // this is an opt-in property, since it has a slight runtime overhead - const orphanIds: null | Set = config.throwIfOrphans ? new Set() : null - - // idea of this loop: - // whenever an item has a parent, but the parent is not yet in the lookup object, we store a preliminary parent - // in the lookup object and fill it with the data of the parent later - // if an item has no parentId, add it as a root element to rootItems - for (const item of items) { - const itemId = item[conf.id] - const parentId = item[conf.parentId] - - // look whether item already exists in the lookup table - if (!Object.prototype.hasOwnProperty.call(lookup, itemId)) { - // item is not yet there, so add a preliminary item (its data will be added later) - lookup[itemId] = { [conf.childrenField]: [] } - } - - // if we track orphans, delete this item from the orphan set if it is in it - if (orphanIds) { orphanIds.delete(itemId) } - - // add the current item's data to the item in the lookup table - if (conf.dataField) { - lookup[itemId][conf.dataField] = item - } else { - lookup[itemId] = { ...item, [conf.childrenField]: lookup[itemId][conf.childrenField] } - } - - const TreeItem = lookup[itemId] - - if (parentId === null || parentId === undefined || parentId === '') { - // is a root item - rootItems.push(TreeItem) - } else { - // has a parent - - // look whether the parent already exists in the lookup table - if (!Object.prototype.hasOwnProperty.call(lookup, parentId)) { - // parent is not yet there, so add a preliminary parent (its data will be added later) - lookup[parentId] = { [conf.childrenField]: [] } - - // if we track orphans, add the generated parent to the orphan list - if (orphanIds) { orphanIds.add(parentId) } - } - - // add the current item to the parent - lookup[parentId][conf.childrenField].push(TreeItem) - } - } - - if (orphanIds?.size) { - throw new Error(`The items array contains orphans that point to the following parentIds: ` + - `[${Array.from(orphanIds)}]. These parentIds do not exist in the items array. Hint: prevent orphans to result ` + - `in an error by passing the following option: { throwIfOrphans: false }`) - } - - return rootItems +export function arrayToTree(items: Item[], config: Partial = {}): TreeItem[] { + const conf: Config = { ...defaultConfig, ...config } + + // the resulting unflattened tree + const rootItems: TreeItem[] = [] + + // stores all already processed items with their ids as key so we can easily look them up + const lookup: { [id: string]: TreeItem } = {} + + // stores all item ids that have not been added to the resulting unflattened tree yet + // this is an opt-in property, since it has a slight runtime overhead + const orphanIds: null | Set = config.throwIfOrphans ? new Set() : null + + // idea of this loop: + // whenever an item has a parent, but the parent is not yet in the lookup object, we store a preliminary parent + // in the lookup object and fill it with the data of the parent later + // if an item has no parentId, add it as a root element to rootItems + for (const item of items) { + const itemId = getNestedProperty(item, conf.id) + const parentId = getNestedProperty(item, conf.parentId) + + // look whether item already exists in the lookup table + if (!Object.prototype.hasOwnProperty.call(lookup, itemId)) { + // item is not yet there, so add a preliminary item (its data will be added later) + lookup[itemId] = { [conf.childrenField]: [] } + } + + // if we track orphans, delete this item from the orphan set if it is in it + if (orphanIds) { + orphanIds.delete(itemId) + } + + // add the current item's data to the item in the lookup table + if (conf.dataField) { + lookup[itemId][conf.dataField] = item + } else { + lookup[itemId] = { ...item, [conf.childrenField]: lookup[itemId][conf.childrenField] } + } + + const TreeItem = lookup[itemId] + + if (parentId === null || parentId === undefined || parentId === '') { + // is a root item + rootItems.push(TreeItem) + } else { + // has a parent + + // look whether the parent already exists in the lookup table + if (!Object.prototype.hasOwnProperty.call(lookup, parentId)) { + // parent is not yet there, so add a preliminary parent (its data will be added later) + lookup[parentId] = { [conf.childrenField]: [] } + + // if we track orphans, add the generated parent to the orphan list + if (orphanIds) { + orphanIds.add(parentId) + } + } + + // add the current item to the parent + lookup[parentId][conf.childrenField].push(TreeItem) + } + } + + if (orphanIds?.size) { + throw new Error( + `The items array contains orphans that point to the following parentIds: ` + + `[${Array.from( + orphanIds + )}]. These parentIds do not exist in the items array. Hint: prevent orphans to result ` + + `in an error by passing the following option: { throwIfOrphans: false }` + ) + } + + return rootItems +} + +/** + * Returns the value of a nested property inside an item + * Example: user can access 'id', or 'parentId' inside item = { nestedObject: { id: 'myId', parentId: 'myParentId' } } + * using getNestedItemProperty(item, 'nestedObject.id') or getNestedItemProperty(item, 'nestedObject.parentId') + * @param item + * @param nestedProperty the chained properties to access the nested property. Eg: 'your.nested.property' + */ +const getNestedProperty = (item: Item, nestedProperty: string): string => { + return nestedProperty.split('.').reduce((o, i) => o[i], item) } From 9ea1978f838219c43195859722c960b8fe7b9cb2 Mon Sep 17 00:00:00 2001 From: Greg Forel Date: Sat, 11 Apr 2020 10:36:18 +0200 Subject: [PATCH 2/7] Updated readme with nested property example --- README.md | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 09ea027..1fa60ed 100644 --- a/README.md +++ b/README.md @@ -59,8 +59,8 @@ Which results in the following array: You can provide a second argument to arrayToTree with configuration options. Right now, you can set the following: -- `id`: key of the id field of the item. Default: `"id"` -- `parentId`: key of the parent's id field of the item. Default: `"parentId"` +- `id`: key of the id field of the item. Default: `"id"`. It also works with nested properties (`"myobject.nestedObject.id"`), see examples below +- `parentId`: key of the parent's id field of the item. Default: `"parentId"`. It also works with nested properties (`"myobject.nestedObject.parentId"`), see examples below - `childrenField`: key which will contain all child nodes of the parent node. Default: `"children"` - `dataField`: key which will contain all properties/data of the original items. Set to null if you don't want a container. Default: `"data"` - `throwIfOrphans`: option to throw an error if the array of items contains one or more items that have no parents in the array. This option has a small runtime penalty, so it's disabled by default. When enabled, the function will throw an error containing the parentIds that were not found in the items array. When disabled, the function will just ignore orphans and not add them to the tree. Default: `false` @@ -91,6 +91,41 @@ Which produces: ] ``` +Nested properties (id and/or parentId are nested inside your objects) +```js +const tree = arrayToTree([ + { nestedObject: { num: '4', ref: null, custom: 'abc' } }, + { nestedObject: { num: '31', ref: '4', custom: '12' } }, + { nestedObject: { num: '1941', ref: '418', custom: 'de' } }, + { nestedObject: { num: '1', ref: '418', custom: 'ZZZz' } }, + { nestedObject: { num: '418', ref: null, custom: 'ü'} }, +], { id: 'nestedObject.num', parentId: 'nestedObject.ref', childrenField: 'nodes' }) +``` + +Which produces: + +```js +[ + { + data: nestedObject { + { num: '4', ref: null, custom: 'abc' }, + nodes: [ + { data: nestedObject { { num: '31', ref: '4', custom: '12' }, nodes: [] } }, + ] + } + }, + { + data: nestedObject { + { num: '418', ref: null, custom: 'ü'}, + nodes: [ + { data: nestedObject { { num: '1941', ref: '418', custom: 'de' }, nodes: [] } }, + { data: nestedObject { { num: '1', ref: '418', custom: 'ZZZz' }, nodes: [] } }, + ] + } + }, +] +``` + Example with no data field: ```js From 10d541eabf12b3960295469f8f531b8f51cb348c Mon Sep 17 00:00:00 2001 From: Philip Stanislaus <6912756+philipstanislaus@users.noreply.github.com> Date: Tue, 2 Feb 2021 21:59:55 +0100 Subject: [PATCH 3/7] Add lint-fix --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 0a3530d..7db2489 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "postversion": "git push && git push --tags", "build": "rm -rf build && tsc && npm run uglify", "lint": "rm -rf build && tslint --project tsconfig.json './src/**/*.ts'", + "lint-fix": "rm -rf build && tslint --project tsconfig.json './src/**/*.ts' --fix", "test-spec": "mocha build/**/*.spec.js -R spec --bail", "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- build/**/*.spec.js -R spec --bail", "test-and-send-cov-to-coveralls": "istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- build/**/*.spec.js -R spec --bail && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js", From 328b6ef377746948f13aa4fc5c9e70c9a2f1008b Mon Sep 17 00:00:00 2001 From: Philip Stanislaus <6912756+philipstanislaus@users.noreply.github.com> Date: Tue, 2 Feb 2021 22:00:21 +0100 Subject: [PATCH 4/7] Fix linting issues --- build/arrayToTree.js | 6 +- build/arrayToTree.js.map | 2 +- build/arrayToTree.min.js | 2 +- build/arrayToTree.spec.js | 126 ++++----- build/arrayToTree.spec.js.map | 2 +- src/arrayToTree.spec.ts | 486 +++++++++++++++++----------------- src/arrayToTree.ts | 114 ++++---- 7 files changed, 369 insertions(+), 369 deletions(-) diff --git a/build/arrayToTree.js b/build/arrayToTree.js index 3ab78fd..927c038 100644 --- a/build/arrayToTree.js +++ b/build/arrayToTree.js @@ -16,7 +16,7 @@ var defaultConfig = { parentId: 'parentId', dataField: 'data', childrenField: 'children', - throwIfOrphans: false + throwIfOrphans: false, }; /** * Unflattens an array to a tree with runtime O(n) @@ -92,7 +92,7 @@ exports.arrayToTree = arrayToTree; * @param item * @param nestedProperty the chained properties to access the nested property. Eg: 'your.nested.property' */ -var getNestedProperty = function (item, nestedProperty) { +function getNestedProperty(item, nestedProperty) { return nestedProperty.split('.').reduce(function (o, i) { return o[i]; }, item); -}; +} //# sourceMappingURL=arrayToTree.js.map \ No newline at end of file diff --git a/build/arrayToTree.js.map b/build/arrayToTree.js.map index 109eba0..71b74f7 100644 --- a/build/arrayToTree.js.map +++ b/build/arrayToTree.js.map @@ -1 +1 @@ -{"version":3,"file":"arrayToTree.js","sourceRoot":"","sources":["../src/arrayToTree.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"arrayToTree.js","sourceRoot":"","sources":["../src/arrayToTree.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/arrayToTree.min.js b/build/arrayToTree.min.js index cef248e..965215f 100644 --- a/build/arrayToTree.min.js +++ b/build/arrayToTree.min.js @@ -1 +1 @@ -"use strict";var __assign=this&&this.__assign||function(){return(__assign=Object.assign||function(e){for(var r,t=1,n=arguments.length;t { - it('should work with nested objects', () => { - expect( + it('should work with nested objects', () => { + expect( arrayToTree([ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, - { id: '418', parentId: null, custom: 'ü' } - ]) + { id: '418', parentId: null, custom: 'ü' }, +]), ).to.deep.equal([ - { - data: { id: '4', parentId: null, custom: 'abc' }, - children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ] - }, - { - data: { id: '418', parentId: null, custom: 'ü' }, - children: [ + { + data: { id: '4', parentId: null, custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], + }, + { + data: { id: '418', parentId: null, custom: 'ü' }, + children: [ { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, - { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] } - ] - } - ]) - }) + { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, + ], + }, +]) + }) - it('should work with integer keys', () => { - expect( + it('should work with integer keys', () => { + expect( arrayToTree([ { id: 4, parentId: null, custom: 'abc' }, { id: 31, parentId: 4, custom: '12' }, { id: 1941, parentId: 418, custom: 'de' }, { id: 1, parentId: 418, custom: 'ZZZz' }, - { id: 418, parentId: null, custom: 'ü' } - ]) + { id: 418, parentId: null, custom: 'ü' }, +]), ).to.deep.equal([ - { - data: { id: 4, parentId: null, custom: 'abc' }, - children: [ { data: { id: 31, parentId: 4, custom: '12' }, children: [] } ] - }, - { - data: { id: 418, parentId: null, custom: 'ü' }, - children: [ + { + data: { id: 4, parentId: null, custom: 'abc' }, + children: [ { data: { id: 31, parentId: 4, custom: '12' }, children: [] } ], + }, + { + data: { id: 418, parentId: null, custom: 'ü' }, + children: [ { data: { id: 1941, parentId: 418, custom: 'de' }, children: [] }, - { data: { id: 1, parentId: 418, custom: 'ZZZz' }, children: [] } - ] - } - ]) - }) + { data: { id: 1, parentId: 418, custom: 'ZZZz' }, children: [] }, + ], + }, +]) + }) - it('should work with nested objects and custom keys', () => { - expect( + it('should work with nested objects and custom keys', () => { + expect( arrayToTree( - [ + [ { num: '4', ref: null, custom: 'abc' }, { num: '31', ref: '4', custom: '12' }, { num: '1941', ref: '418', custom: 'de' }, { num: '1', ref: '418', custom: 'ZZZz' }, - { num: '418', ref: null, custom: 'ü' } - ], - { id: 'num', parentId: 'ref', childrenField: 'nodes' } - ) + { num: '418', ref: null, custom: 'ü' }, + ], + { id: 'num', parentId: 'ref', childrenField: 'nodes' }, + ), ).to.deep.equal([ - { - data: { num: '4', ref: null, custom: 'abc' }, - nodes: [ { data: { num: '31', ref: '4', custom: '12' }, nodes: [] } ] - }, - { - data: { num: '418', ref: null, custom: 'ü' }, - nodes: [ + { + data: { num: '4', ref: null, custom: 'abc' }, + nodes: [ { data: { num: '31', ref: '4', custom: '12' }, nodes: [] } ], + }, + { + data: { num: '418', ref: null, custom: 'ü' }, + nodes: [ { data: { num: '1941', ref: '418', custom: 'de' }, nodes: [] }, - { data: { num: '1', ref: '418', custom: 'ZZZz' }, nodes: [] } - ] - } - ]) - }) + { data: { num: '1', ref: '418', custom: 'ZZZz' }, nodes: [] }, + ], + }, +]) + }) - it('should ignore objects if parentId does not exist', () => { - expect( + it('should ignore objects if parentId does not exist', () => { + expect( arrayToTree([ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, { id: '418', parentId: null, custom: 'ü' }, - { id: '1313', parentId: '13', custom: 'Not existing' } - ]) + { id: '1313', parentId: '13', custom: 'Not existing' }, +]), ).to.deep.equal([ - { - data: { id: '4', parentId: null, custom: 'abc' }, - children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ] - }, - { - data: { id: '418', parentId: null, custom: 'ü' }, - children: [ + { + data: { id: '4', parentId: null, custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], + }, + { + data: { id: '418', parentId: null, custom: 'ü' }, + children: [ { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, - { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] } - ] - } - ]) - }) + { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, + ], + }, +]) + }) - it('should work with nested objects with dataField set to null', () => { - expect( + it('should work with nested objects with dataField set to null', () => { + expect( arrayToTree( - [ + [ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, - { id: '418', parentId: null, custom: 'ü' } - ], - { dataField: null } - ) + { id: '418', parentId: null, custom: 'ü' }, + ], + { dataField: null }, + ), ).to.deep.equal([ - { - id: '4', - parentId: null, - custom: 'abc', - children: [ { id: '31', parentId: '4', custom: '12', children: [] } ] - }, - { - id: '418', - parentId: null, - custom: 'ü', - children: [ + { + id: '4', + parentId: null, + custom: 'abc', + children: [ { id: '31', parentId: '4', custom: '12', children: [] } ], + }, + { + id: '418', + parentId: null, + custom: 'ü', + children: [ { id: '1941', parentId: '418', custom: 'de', children: [] }, - { id: '1', parentId: '418', custom: 'ZZZz', children: [] } - ] - } - ]) - }) + { id: '1', parentId: '418', custom: 'ZZZz', children: [] }, + ], + }, +]) + }) - it('should work with nested objects and custom keys with dataField set to null', () => { - expect( + it('should work with nested objects and custom keys with dataField set to null', () => { + expect( arrayToTree( - [ + [ { num: '4', ref: null, custom: 'abc' }, { num: '31', ref: '4', custom: '12' }, { num: '1941', ref: '418', custom: 'de' }, { num: '1', ref: '418', custom: 'ZZZz' }, - { num: '418', ref: null, custom: 'ü' } - ], - { id: 'num', parentId: 'ref', dataField: null } - ) + { num: '418', ref: null, custom: 'ü' }, + ], + { id: 'num', parentId: 'ref', dataField: null }, + ), ).to.deep.equal([ - { - num: '4', - ref: null, - custom: 'abc', - children: [ { num: '31', ref: '4', custom: '12', children: [] } ] - }, - { - num: '418', - ref: null, - custom: 'ü', - children: [ + { + num: '4', + ref: null, + custom: 'abc', + children: [ { num: '31', ref: '4', custom: '12', children: [] } ], + }, + { + num: '418', + ref: null, + custom: 'ü', + children: [ { num: '1941', ref: '418', custom: 'de', children: [] }, - { num: '1', ref: '418', custom: 'ZZZz', children: [] } - ] - } - ]) - }) + { num: '1', ref: '418', custom: 'ZZZz', children: [] }, + ], + }, +]) + }) - it('should ignore objects if parentId does not exist with dataField set to null', () => { - expect( + it('should ignore objects if parentId does not exist with dataField set to null', () => { + expect( arrayToTree( - [ + [ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, { id: '418', parentId: null, custom: 'ü' }, - { id: '1313', parentId: '13', custom: 'Not existing' } - ], - { dataField: null } - ) + { id: '1313', parentId: '13', custom: 'Not existing' }, + ], + { dataField: null }, + ), ).to.deep.equal([ - { - id: '4', - parentId: null, - custom: 'abc', - children: [ { id: '31', parentId: '4', custom: '12', children: [] } ] - }, - { - id: '418', - parentId: null, - custom: 'ü', - children: [ + { + id: '4', + parentId: null, + custom: 'abc', + children: [ { id: '31', parentId: '4', custom: '12', children: [] } ], + }, + { + id: '418', + parentId: null, + custom: 'ü', + children: [ { id: '1941', parentId: '418', custom: 'de', children: [] }, - { id: '1', parentId: '418', custom: 'ZZZz', children: [] } - ] - } - ]) - }) + { id: '1', parentId: '418', custom: 'ZZZz', children: [] }, + ], + }, +]) + }) - it('should treat objects with missing parentId as root objects', () => { - expect( + it('should treat objects with missing parentId as root objects', () => { + expect( arrayToTree([ { id: '4', custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, { id: '418', custom: 'ü' }, - { id: '1313', parentId: '13', custom: 'Not existing' } - ]) + { id: '1313', parentId: '13', custom: 'Not existing' }, +]), ).to.deep.equal([ - { - data: { id: '4', custom: 'abc' }, - children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ] - }, - { - data: { id: '418', custom: 'ü' }, - children: [ + { + data: { id: '4', custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], + }, + { + data: { id: '418', custom: 'ü' }, + children: [ { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, - { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] } - ] - } - ]) - }) + { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, + ], + }, +]) + }) - it('should treat objects with empty string as parentId as root objects', () => { - expect( + it('should treat objects with empty string as parentId as root objects', () => { + expect( arrayToTree([ { id: '4', parentId: '', custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, { id: '418', parentId: '', custom: 'ü' }, - { id: '1313', parentId: '13', custom: 'Not existing' } - ]) + { id: '1313', parentId: '13', custom: 'Not existing' }, +]), ).to.deep.equal([ - { - data: { id: '4', parentId: '', custom: 'abc' }, - children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ] - }, - { - data: { id: '418', parentId: '', custom: 'ü' }, - children: [ + { + data: { id: '4', parentId: '', custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], + }, + { + data: { id: '418', parentId: '', custom: 'ü' }, + children: [ { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, - { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] } - ] - } - ]) - }) + { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, + ], + }, +]) + }) - it('should not throw if orphans exist but throwIfOrphans is false', () => { - expect( + it('should not throw if orphans exist but throwIfOrphans is false', () => { + expect( arrayToTree([ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, - { id: '418', parentId: '6', custom: 'ü' } - ]) + { id: '418', parentId: '6', custom: 'ü' }, +]), ).to.deep.equal([ - { - data: { id: '4', parentId: null, custom: 'abc' }, - children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ] - } - ]) - }) + { + data: { id: '4', parentId: null, custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], + }, +]) + }) - it('should throw if orphans exist and throwIfOrphans is true', () => { - expect(() => + it('should throw if orphans exist and throwIfOrphans is true', () => { + expect(() => arrayToTree( - [ + [ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '418', parentId: '6', custom: 'ü' }, { id: '419', parentId: '418', custom: 'ü' }, - { id: '420', parentId: '7', custom: 'ü' } - ], - { throwIfOrphans: true } - ) + { id: '420', parentId: '7', custom: 'ü' }, + ], + { throwIfOrphans: true }, + ), ).to.throw( 'The items array contains orphans that point to the following parentIds: [6,7]. ' + 'These parentIds do not exist in the items array. ' + - 'Hint: prevent orphans to result in an error by passing the following option: { throwIfOrphans: false }' + 'Hint: prevent orphans to result in an error by passing the following option: { throwIfOrphans: false }', ) - }) + }) - it('should not throw if no orphans exist and throwIfOrphans is true, but the order is different (see #18)', () => { - expect( + it('should not throw if no orphans exist and throwIfOrphans is true, but the order is different (see #18)', () => { + expect( arrayToTree( - [ + [ { id: '2', parentId: 'root', foo: 'bar' }, { id: '1-1', parentId: '1', foo: 'bar' }, { id: '1', parentId: 'root', foo: 'bar' }, - { id: 'root', parentId: null, bar: 'bar' } - ], - { dataField: null, throwIfOrphans: true } - ) + { id: 'root', parentId: null, bar: 'bar' }, + ], + { dataField: null, throwIfOrphans: true }, + ), ).to.deep.equal([ - { - id: 'root', - parentId: null, - bar: 'bar', - children: [ + { + id: 'root', + parentId: null, + bar: 'bar', + children: [ { id: '2', parentId: 'root', foo: 'bar', children: [] }, - { - id: '1', - parentId: 'root', - foo: 'bar', - children: [ { id: '1-1', parentId: '1', foo: 'bar', children: [] } ] - } - ] - } - ]) - }) + { + id: '1', + parentId: 'root', + foo: 'bar', + children: [ { id: '1-1', parentId: '1', foo: 'bar', children: [] } ], + }, + ], + }, +]) + }) - it('should work with empty inputs', () => { - expect(arrayToTree([])).to.deep.equal([]) - }) + it('should work with empty inputs', () => { + expect(arrayToTree([])).to.deep.equal([]) + }) - it('should work with nested objects and nested id and/or parentId properties', () => { - expect( + it('should work with nested objects and nested id and/or parentId properties', () => { + expect( arrayToTree( - [ + [ { nestedProperties: { id: '1', parentId: null, custom: '1' } }, { nestedProperties: { id: '1.1', parentId: '1', custom: '1.1' } }, { nestedProperties: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, { nestedProperties: { id: '1.2', parentId: '1', custom: '1.2' } }, - { nestedProperties: { id: '2', parentId: null, custom: '2' } } - ], - { id: 'nestedProperties.id', parentId: 'nestedProperties.parentId' } - ) + { nestedProperties: { id: '2', parentId: null, custom: '2' } }, + ], + { id: 'nestedProperties.id', parentId: 'nestedProperties.parentId' }, + ), ).to.deep.equal([ - { - data: { nestedProperties: { id: '1', parentId: null, custom: '1' } }, - children: [ - { - data: { nestedProperties: { id: '1.1', parentId: '1', custom: '1.1' } }, - children: [ - { - data: { nestedProperties: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, - children: [] - } - ] - }, - { - data: { nestedProperties: { id: '1.2', parentId: '1', custom: '1.2' } }, - children: [] - } - ] - }, - { - data: { nestedProperties: { id: '2', parentId: null, custom: '2' } }, - children: [] - } - ]) - }) + { + data: { nestedProperties: { id: '1', parentId: null, custom: '1' } }, + children: [ + { + data: { nestedProperties: { id: '1.1', parentId: '1', custom: '1.1' } }, + children: [ + { + data: { nestedProperties: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, + children: [], + }, + ], + }, + { + data: { nestedProperties: { id: '1.2', parentId: '1', custom: '1.2' } }, + children: [], + }, + ], + }, + { + data: { nestedProperties: { id: '2', parentId: null, custom: '2' } }, + children: [], + }, +]) + }) }) diff --git a/src/arrayToTree.ts b/src/arrayToTree.ts index e959495..7bbc21c 100644 --- a/src/arrayToTree.ts +++ b/src/arrayToTree.ts @@ -1,117 +1,117 @@ export interface Item { - id?: string | number - parentId?: string | number | null - [key: string]: any + id?: string | number + parentId?: string | number | null + [key: string]: any } export interface TreeItem { - id?: string | number - parentId?: string | number | null - [key: string]: Item | TreeItem[] | any + id?: string | number + parentId?: string | number | null + [key: string]: Item | TreeItem[] | any } export interface Config { - id: string - parentId: string - dataField: string | null - childrenField: string - throwIfOrphans: boolean + id: string + parentId: string + dataField: string | null + childrenField: string + throwIfOrphans: boolean } const defaultConfig: Config = { - id: 'id', - parentId: 'parentId', - dataField: 'data', - childrenField: 'children', - throwIfOrphans: false + id: 'id', + parentId: 'parentId', + dataField: 'data', + childrenField: 'children', + throwIfOrphans: false, } /** * Unflattens an array to a tree with runtime O(n) */ -export function arrayToTree(items: Item[], config: Partial = {}): TreeItem[] { - const conf: Config = { ...defaultConfig, ...config } +export function arrayToTree (items: Item[], config: Partial = {}): TreeItem[] { + const conf: Config = { ...defaultConfig, ...config } // the resulting unflattened tree - const rootItems: TreeItem[] = [] + const rootItems: TreeItem[] = [] // stores all already processed items with their ids as key so we can easily look them up - const lookup: { [id: string]: TreeItem } = {} + const lookup: { [id: string]: TreeItem } = {} // stores all item ids that have not been added to the resulting unflattened tree yet // this is an opt-in property, since it has a slight runtime overhead - const orphanIds: null | Set = config.throwIfOrphans ? new Set() : null + const orphanIds: null | Set = config.throwIfOrphans ? new Set() : null // idea of this loop: // whenever an item has a parent, but the parent is not yet in the lookup object, we store a preliminary parent // in the lookup object and fill it with the data of the parent later // if an item has no parentId, add it as a root element to rootItems - for (const item of items) { - const itemId = getNestedProperty(item, conf.id) - const parentId = getNestedProperty(item, conf.parentId) + for (const item of items) { + const itemId = getNestedProperty(item, conf.id) + const parentId = getNestedProperty(item, conf.parentId) // look whether item already exists in the lookup table - if (!Object.prototype.hasOwnProperty.call(lookup, itemId)) { + if (!Object.prototype.hasOwnProperty.call(lookup, itemId)) { // item is not yet there, so add a preliminary item (its data will be added later) - lookup[itemId] = { [conf.childrenField]: [] } - } + lookup[itemId] = { [conf.childrenField]: [] } + } // if we track orphans, delete this item from the orphan set if it is in it - if (orphanIds) { - orphanIds.delete(itemId) - } + if (orphanIds) { + orphanIds.delete(itemId) + } // add the current item's data to the item in the lookup table - if (conf.dataField) { - lookup[itemId][conf.dataField] = item - } else { - lookup[itemId] = { ...item, [conf.childrenField]: lookup[itemId][conf.childrenField] } - } + if (conf.dataField) { + lookup[itemId][conf.dataField] = item + } else { + lookup[itemId] = { ...item, [conf.childrenField]: lookup[itemId][conf.childrenField] } + } - const TreeItem = lookup[itemId] + const TreeItem = lookup[itemId] - if (parentId === null || parentId === undefined || parentId === '') { + if (parentId === null || parentId === undefined || parentId === '') { // is a root item - rootItems.push(TreeItem) - } else { + rootItems.push(TreeItem) + } else { // has a parent // look whether the parent already exists in the lookup table - if (!Object.prototype.hasOwnProperty.call(lookup, parentId)) { + if (!Object.prototype.hasOwnProperty.call(lookup, parentId)) { // parent is not yet there, so add a preliminary parent (its data will be added later) - lookup[parentId] = { [conf.childrenField]: [] } + lookup[parentId] = { [conf.childrenField]: [] } // if we track orphans, add the generated parent to the orphan list - if (orphanIds) { - orphanIds.add(parentId) - } - } + if (orphanIds) { + orphanIds.add(parentId) + } + } // add the current item to the parent - lookup[parentId][conf.childrenField].push(TreeItem) - } - } + lookup[parentId][conf.childrenField].push(TreeItem) + } + } - if (orphanIds?.size) { - throw new Error( + if (orphanIds?.size) { + throw new Error( `The items array contains orphans that point to the following parentIds: ` + `[${Array.from( - orphanIds + orphanIds, )}]. These parentIds do not exist in the items array. Hint: prevent orphans to result ` + - `in an error by passing the following option: { throwIfOrphans: false }` + `in an error by passing the following option: { throwIfOrphans: false }`, ) - } + } - return rootItems + return rootItems } /** * Returns the value of a nested property inside an item * Example: user can access 'id', or 'parentId' inside item = { nestedObject: { id: 'myId', parentId: 'myParentId' } } * using getNestedItemProperty(item, 'nestedObject.id') or getNestedItemProperty(item, 'nestedObject.parentId') - * @param item + * @param item * @param nestedProperty the chained properties to access the nested property. Eg: 'your.nested.property' */ -const getNestedProperty = (item: Item, nestedProperty: string): string => { - return nestedProperty.split('.').reduce((o, i) => o[i], item) +function getNestedProperty (item: Item, nestedProperty: string) { + return nestedProperty.split('.').reduce((o, i) => o[i], item) } From e17f9602f9b94a16a4a436224d1264fd326e6b22 Mon Sep 17 00:00:00 2001 From: Philip Stanislaus <6912756+philipstanislaus@users.noreply.github.com> Date: Tue, 2 Feb 2021 22:07:34 +0100 Subject: [PATCH 5/7] Fix formatting --- build/arrayToTree.spec.js.map | 2 +- src/arrayToTree.spec.ts | 188 +++++++++++++++------------------- 2 files changed, 86 insertions(+), 104 deletions(-) diff --git a/build/arrayToTree.spec.js.map b/build/arrayToTree.spec.js.map index 3a7cb89..0edb0c9 100644 --- a/build/arrayToTree.spec.js.map +++ b/build/arrayToTree.spec.js.map @@ -1 +1 @@ -{"version":3,"file":"arrayToTree.spec.js","sourceRoot":"","sources":["../src/arrayToTree.spec.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"arrayToTree.spec.js","sourceRoot":"","sources":["../src/arrayToTree.spec.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/arrayToTree.spec.ts b/src/arrayToTree.spec.ts index 2ce8b13..06e4019 100644 --- a/src/arrayToTree.spec.ts +++ b/src/arrayToTree.spec.ts @@ -3,63 +3,58 @@ import { arrayToTree } from './arrayToTree' describe('arrayToTree', () => { it('should work with nested objects', () => { - expect( - arrayToTree([ + expect(arrayToTree([ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, { id: '418', parentId: null, custom: 'ü' }, -]), - ).to.deep.equal([ - { - data: { id: '4', parentId: null, custom: 'abc' }, - children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], - }, - { - data: { id: '418', parentId: null, custom: 'ü' }, - children: [ + ])).to.deep.equal([ + { + data: { id: '4', parentId: null, custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], + }, + { + data: { id: '418', parentId: null, custom: 'ü' }, + children: [ { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, - ], - }, -]) + ], + }, + ]) }) it('should work with integer keys', () => { - expect( - arrayToTree([ + expect(arrayToTree([ { id: 4, parentId: null, custom: 'abc' }, { id: 31, parentId: 4, custom: '12' }, { id: 1941, parentId: 418, custom: 'de' }, { id: 1, parentId: 418, custom: 'ZZZz' }, { id: 418, parentId: null, custom: 'ü' }, -]), - ).to.deep.equal([ - { - data: { id: 4, parentId: null, custom: 'abc' }, - children: [ { data: { id: 31, parentId: 4, custom: '12' }, children: [] } ], - }, - { - data: { id: 418, parentId: null, custom: 'ü' }, - children: [ + ])).to.deep.equal([ + { + data: { id: 4, parentId: null, custom: 'abc' }, + children: [ { data: { id: 31, parentId: 4, custom: '12' }, children: [] } ], + }, + { + data: { id: 418, parentId: null, custom: 'ü' }, + children: [ { data: { id: 1941, parentId: 418, custom: 'de' }, children: [] }, { data: { id: 1, parentId: 418, custom: 'ZZZz' }, children: [] }, - ], - }, -]) + ], + }, + ]) }) it('should work with nested objects and custom keys', () => { - expect( - arrayToTree( - [ + expect(arrayToTree( + [ { num: '4', ref: null, custom: 'abc' }, { num: '31', ref: '4', custom: '12' }, { num: '1941', ref: '418', custom: 'de' }, { num: '1', ref: '418', custom: 'ZZZz' }, { num: '418', ref: null, custom: 'ü' }, - ], + ], { id: 'num', parentId: 'ref', childrenField: 'nodes' }, ), ).to.deep.equal([ @@ -78,40 +73,37 @@ describe('arrayToTree', () => { }) it('should ignore objects if parentId does not exist', () => { - expect( - arrayToTree([ + expect(arrayToTree([ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, { id: '418', parentId: null, custom: 'ü' }, { id: '1313', parentId: '13', custom: 'Not existing' }, -]), - ).to.deep.equal([ - { - data: { id: '4', parentId: null, custom: 'abc' }, - children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], - }, - { - data: { id: '418', parentId: null, custom: 'ü' }, - children: [ + ])).to.deep.equal([ + { + data: { id: '4', parentId: null, custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], + }, + { + data: { id: '418', parentId: null, custom: 'ü' }, + children: [ { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, - ], - }, -]) + ], + }, + ]) }) it('should work with nested objects with dataField set to null', () => { - expect( - arrayToTree( - [ + expect(arrayToTree( + [ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, { id: '418', parentId: null, custom: 'ü' }, - ], + ], { dataField: null }, ), ).to.deep.equal([ @@ -134,15 +126,14 @@ describe('arrayToTree', () => { }) it('should work with nested objects and custom keys with dataField set to null', () => { - expect( - arrayToTree( - [ + expect(arrayToTree( + [ { num: '4', ref: null, custom: 'abc' }, { num: '31', ref: '4', custom: '12' }, { num: '1941', ref: '418', custom: 'de' }, { num: '1', ref: '418', custom: 'ZZZz' }, { num: '418', ref: null, custom: 'ü' }, - ], + ], { id: 'num', parentId: 'ref', dataField: null }, ), ).to.deep.equal([ @@ -165,16 +156,15 @@ describe('arrayToTree', () => { }) it('should ignore objects if parentId does not exist with dataField set to null', () => { - expect( - arrayToTree( - [ + expect(arrayToTree( + [ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, { id: '418', parentId: null, custom: 'ü' }, { id: '1313', parentId: '13', custom: 'Not existing' }, - ], + ], { dataField: null }, ), ).to.deep.equal([ @@ -197,68 +187,62 @@ describe('arrayToTree', () => { }) it('should treat objects with missing parentId as root objects', () => { - expect( - arrayToTree([ + expect(arrayToTree([ { id: '4', custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, { id: '418', custom: 'ü' }, { id: '1313', parentId: '13', custom: 'Not existing' }, -]), - ).to.deep.equal([ - { - data: { id: '4', custom: 'abc' }, - children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], - }, - { - data: { id: '418', custom: 'ü' }, - children: [ + ])).to.deep.equal([ + { + data: { id: '4', custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], + }, + { + data: { id: '418', custom: 'ü' }, + children: [ { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, - ], - }, -]) + ], + }, + ]) }) it('should treat objects with empty string as parentId as root objects', () => { - expect( - arrayToTree([ + expect(arrayToTree([ { id: '4', parentId: '', custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '1941', parentId: '418', custom: 'de' }, { id: '1', parentId: '418', custom: 'ZZZz' }, { id: '418', parentId: '', custom: 'ü' }, { id: '1313', parentId: '13', custom: 'Not existing' }, -]), - ).to.deep.equal([ - { - data: { id: '4', parentId: '', custom: 'abc' }, - children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], - }, - { - data: { id: '418', parentId: '', custom: 'ü' }, - children: [ + ])).to.deep.equal([ + { + data: { id: '4', parentId: '', custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], + }, + { + data: { id: '418', parentId: '', custom: 'ü' }, + children: [ { data: { id: '1941', parentId: '418', custom: 'de' }, children: [] }, { data: { id: '1', parentId: '418', custom: 'ZZZz' }, children: [] }, - ], - }, -]) + ], + }, + ]) }) it('should not throw if orphans exist but throwIfOrphans is false', () => { - expect( - arrayToTree([ + expect(arrayToTree([ { id: '4', parentId: null, custom: 'abc' }, { id: '31', parentId: '4', custom: '12' }, { id: '418', parentId: '6', custom: 'ü' }, -]), - ).to.deep.equal([ - { - data: { id: '4', parentId: null, custom: 'abc' }, - children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], - }, -]) + ])).to.deep.equal([ + { + data: { id: '4', parentId: null, custom: 'abc' }, + children: [ { data: { id: '31', parentId: '4', custom: '12' }, children: [] } ], + }, + ]) }) it('should throw if orphans exist and throwIfOrphans is true', () => { @@ -281,14 +265,13 @@ describe('arrayToTree', () => { }) it('should not throw if no orphans exist and throwIfOrphans is true, but the order is different (see #18)', () => { - expect( - arrayToTree( - [ + expect(arrayToTree( + [ { id: '2', parentId: 'root', foo: 'bar' }, { id: '1-1', parentId: '1', foo: 'bar' }, { id: '1', parentId: 'root', foo: 'bar' }, { id: 'root', parentId: null, bar: 'bar' }, - ], + ], { dataField: null, throwIfOrphans: true }, ), ).to.deep.equal([ @@ -314,15 +297,14 @@ describe('arrayToTree', () => { }) it('should work with nested objects and nested id and/or parentId properties', () => { - expect( - arrayToTree( - [ + expect(arrayToTree( + [ { nestedProperties: { id: '1', parentId: null, custom: '1' } }, { nestedProperties: { id: '1.1', parentId: '1', custom: '1.1' } }, { nestedProperties: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, { nestedProperties: { id: '1.2', parentId: '1', custom: '1.2' } }, { nestedProperties: { id: '2', parentId: null, custom: '2' } }, - ], + ], { id: 'nestedProperties.id', parentId: 'nestedProperties.parentId' }, ), ).to.deep.equal([ From 344958cd90faab40f3b2a9b5e41091adcfe5338a Mon Sep 17 00:00:00 2001 From: Philip Stanislaus <6912756+philipstanislaus@users.noreply.github.com> Date: Tue, 2 Feb 2021 22:23:06 +0100 Subject: [PATCH 6/7] Update README --- README.md | 58 ++++++++++++++++++++----------------------------------- 1 file changed, 21 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 1fa60ed..4d6fdec 100644 --- a/README.md +++ b/README.md @@ -59,8 +59,8 @@ Which results in the following array: You can provide a second argument to arrayToTree with configuration options. Right now, you can set the following: -- `id`: key of the id field of the item. Default: `"id"`. It also works with nested properties (`"myobject.nestedObject.id"`), see examples below -- `parentId`: key of the parent's id field of the item. Default: `"parentId"`. It also works with nested properties (`"myobject.nestedObject.parentId"`), see examples below +- `id`: key of the id field of the item. Also works with nested properties (e. g. `"nested.parentId"`). Default: `"id"`. +- `parentId`: key of the parent's id field of the item. Also works with nested properties (e. g. `"nested.parentId"`). Default: `"parentId"`. - `childrenField`: key which will contain all child nodes of the parent node. Default: `"children"` - `dataField`: key which will contain all properties/data of the original items. Set to null if you don't want a container. Default: `"data"` - `throwIfOrphans`: option to throw an error if the array of items contains one or more items that have no parents in the array. This option has a small runtime penalty, so it's disabled by default. When enabled, the function will throw an error containing the parentIds that were not found in the items array. When disabled, the function will just ignore orphans and not add them to the tree. Default: `false` @@ -91,41 +91,6 @@ Which produces: ] ``` -Nested properties (id and/or parentId are nested inside your objects) -```js -const tree = arrayToTree([ - { nestedObject: { num: '4', ref: null, custom: 'abc' } }, - { nestedObject: { num: '31', ref: '4', custom: '12' } }, - { nestedObject: { num: '1941', ref: '418', custom: 'de' } }, - { nestedObject: { num: '1', ref: '418', custom: 'ZZZz' } }, - { nestedObject: { num: '418', ref: null, custom: 'ü'} }, -], { id: 'nestedObject.num', parentId: 'nestedObject.ref', childrenField: 'nodes' }) -``` - -Which produces: - -```js -[ - { - data: nestedObject { - { num: '4', ref: null, custom: 'abc' }, - nodes: [ - { data: nestedObject { { num: '31', ref: '4', custom: '12' }, nodes: [] } }, - ] - } - }, - { - data: nestedObject { - { num: '418', ref: null, custom: 'ü'}, - nodes: [ - { data: nestedObject { { num: '1941', ref: '418', custom: 'de' }, nodes: [] } }, - { data: nestedObject { { num: '1', ref: '418', custom: 'ZZZz' }, nodes: [] } }, - ] - } - }, -] -``` - Example with no data field: ```js @@ -152,6 +117,25 @@ Which produces: ] ``` +Example with nested id/parentId properties: + +```js +const tree = arrayToTree([ + { num: { id: '4' }, parent: { parentId: null }, custom: 'abc' }, + { num: { id: '31' }, parent: { parentId: '4' }, custom: '12' }, +], { id: 'num.id', parentId: 'parent.parentId' }) +``` + +Which produces: + +```js +[ + { data: { num: { id: '4' }, parent: { parentId: null }, custom: 'abc' }, children: [ + { data: { num: { id: '31' }, parent: { parentId: '4' }, custom: '12' }, children: [] }, + ] }, +] +``` + ## TypeScript This project includes types, just import the module as usual: From c72ff282264fb2da53601a36966e7b1a281db77e Mon Sep 17 00:00:00 2001 From: Philip Stanislaus <6912756+philipstanislaus@users.noreply.github.com> Date: Tue, 2 Feb 2021 22:29:59 +0100 Subject: [PATCH 7/7] Add built files --- build/arrayToTree.spec.js | 66 +++++++++++++++++++++++------ build/arrayToTree.spec.js.map | 2 +- src/arrayToTree.spec.ts | 79 +++++++++++++++++++++++++++++------ 3 files changed, 122 insertions(+), 25 deletions(-) diff --git a/build/arrayToTree.spec.js b/build/arrayToTree.spec.js index d8c495d..8e48f35 100644 --- a/build/arrayToTree.spec.js +++ b/build/arrayToTree.spec.js @@ -259,37 +259,79 @@ describe('arrayToTree', function () { it('should work with empty inputs', function () { chai_1.expect(arrayToTree_1.arrayToTree([])).to.deep.equal([]); }); - it('should work with nested objects and nested id and/or parentId properties', function () { + it('should work with nested objects and nested id and parentId properties', function () { chai_1.expect(arrayToTree_1.arrayToTree([ - { nestedProperties: { id: '1', parentId: null, custom: '1' } }, - { nestedProperties: { id: '1.1', parentId: '1', custom: '1.1' } }, - { nestedProperties: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, - { nestedProperties: { id: '1.2', parentId: '1', custom: '1.2' } }, - { nestedProperties: { id: '2', parentId: null, custom: '2' } }, - ], { id: 'nestedProperties.id', parentId: 'nestedProperties.parentId' })).to.deep.equal([ + { nested: { id: '1', parentId: null, custom: '1' } }, + { nested: { id: '1.1', parentId: '1', custom: '1.1' } }, + { nested: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, + { nested: { id: '1.2', parentId: '1', custom: '1.2' } }, + { nested: { id: '2', parentId: null, custom: '2' } }, + ], { id: 'nested.id', parentId: 'nested.parentId' })).to.deep.equal([ { - data: { nestedProperties: { id: '1', parentId: null, custom: '1' } }, + data: { nested: { id: '1', parentId: null, custom: '1' } }, children: [ { - data: { nestedProperties: { id: '1.1', parentId: '1', custom: '1.1' } }, + data: { nested: { id: '1.1', parentId: '1', custom: '1.1' } }, children: [ { - data: { nestedProperties: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, + data: { nested: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, children: [], }, ], }, { - data: { nestedProperties: { id: '1.2', parentId: '1', custom: '1.2' } }, + data: { nested: { id: '1.2', parentId: '1', custom: '1.2' } }, children: [], }, ], }, { - data: { nestedProperties: { id: '2', parentId: null, custom: '2' } }, + data: { nested: { id: '2', parentId: null, custom: '2' } }, children: [], }, ]); }); + it('should work with nested id property', function () { + chai_1.expect(arrayToTree_1.arrayToTree([ + { one: { id: '1' }, parentId: null, custom: '1' }, + { one: { id: '1.1' }, parentId: '1', custom: '1.1' }, + ], { id: 'one.id', parentId: 'parentId' })).to.deep.equal([{ + data: { one: { id: '1' }, parentId: null, custom: '1' }, + children: [ + { + data: { one: { id: '1.1' }, parentId: '1', custom: '1.1' }, + children: [], + }, + ], + }]); + }); + it('should work with nested parentId property', function () { + chai_1.expect(arrayToTree_1.arrayToTree([ + { id: '1', two: { parentId: null }, custom: '1' }, + { id: '1.1', two: { parentId: '1' }, custom: '1.1' }, + ], { id: 'id', parentId: 'two.parentId' })).to.deep.equal([{ + data: { id: '1', two: { parentId: null }, custom: '1' }, + children: [ + { + data: { id: '1.1', two: { parentId: '1' }, custom: '1.1' }, + children: [], + }, + ], + }]); + }); + it('should work with nested id and parentId properties', function () { + chai_1.expect(arrayToTree_1.arrayToTree([ + { one: { id: '1' }, two: { parentId: null }, custom: '1' }, + { one: { id: '1.1' }, two: { parentId: '1' }, custom: '1.1' }, + ], { id: 'one.id', parentId: 'two.parentId' })).to.deep.equal([{ + data: { one: { id: '1' }, two: { parentId: null }, custom: '1' }, + children: [ + { + data: { one: { id: '1.1' }, two: { parentId: '1' }, custom: '1.1' }, + children: [], + }, + ], + }]); + }); }); //# sourceMappingURL=arrayToTree.spec.js.map \ No newline at end of file diff --git a/build/arrayToTree.spec.js.map b/build/arrayToTree.spec.js.map index 0edb0c9..723756e 100644 --- a/build/arrayToTree.spec.js.map +++ b/build/arrayToTree.spec.js.map @@ -1 +1 @@ -{"version":3,"file":"arrayToTree.spec.js","sourceRoot":"","sources":["../src/arrayToTree.spec.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"arrayToTree.spec.js","sourceRoot":"","sources":["../src/arrayToTree.spec.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/arrayToTree.spec.ts b/src/arrayToTree.spec.ts index 06e4019..32044f5 100644 --- a/src/arrayToTree.spec.ts +++ b/src/arrayToTree.spec.ts @@ -296,40 +296,95 @@ describe('arrayToTree', () => { expect(arrayToTree([])).to.deep.equal([]) }) - it('should work with nested objects and nested id and/or parentId properties', () => { + it('should work with nested objects and nested id and parentId properties', () => { expect(arrayToTree( [ - { nestedProperties: { id: '1', parentId: null, custom: '1' } }, - { nestedProperties: { id: '1.1', parentId: '1', custom: '1.1' } }, - { nestedProperties: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, - { nestedProperties: { id: '1.2', parentId: '1', custom: '1.2' } }, - { nestedProperties: { id: '2', parentId: null, custom: '2' } }, + { nested: { id: '1', parentId: null, custom: '1' } }, + { nested: { id: '1.1', parentId: '1', custom: '1.1' } }, + { nested: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, + { nested: { id: '1.2', parentId: '1', custom: '1.2' } }, + { nested: { id: '2', parentId: null, custom: '2' } }, ], - { id: 'nestedProperties.id', parentId: 'nestedProperties.parentId' }, + { id: 'nested.id', parentId: 'nested.parentId' }, ), ).to.deep.equal([ { - data: { nestedProperties: { id: '1', parentId: null, custom: '1' } }, + data: { nested: { id: '1', parentId: null, custom: '1' } }, children: [ { - data: { nestedProperties: { id: '1.1', parentId: '1', custom: '1.1' } }, + data: { nested: { id: '1.1', parentId: '1', custom: '1.1' } }, children: [ { - data: { nestedProperties: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, + data: { nested: { id: '1.1.1', parentId: '1.1', custom: '1.1.1' } }, children: [], }, ], }, { - data: { nestedProperties: { id: '1.2', parentId: '1', custom: '1.2' } }, + data: { nested: { id: '1.2', parentId: '1', custom: '1.2' } }, children: [], }, ], }, { - data: { nestedProperties: { id: '2', parentId: null, custom: '2' } }, + data: { nested: { id: '2', parentId: null, custom: '2' } }, children: [], }, ]) + + }) + it('should work with nested id property', () => { + expect(arrayToTree( + [ + { one: { id: '1' }, parentId: null, custom: '1' }, + { one: { id: '1.1' }, parentId: '1', custom: '1.1' }, + ], + { id: 'one.id', parentId: 'parentId' }, + ), + ).to.deep.equal([{ + data: { one: { id: '1' }, parentId: null, custom: '1' }, + children: [ + { + data: { one: { id: '1.1' }, parentId: '1', custom: '1.1' }, + children: [], + }, + ], +}]) + }) + it('should work with nested parentId property', () => { + expect(arrayToTree( + [ + { id: '1', two: { parentId: null }, custom: '1' }, + { id: '1.1', two: { parentId: '1' }, custom: '1.1' }, + ], + { id: 'id', parentId: 'two.parentId' }, + ), + ).to.deep.equal([{ + data: { id: '1', two: { parentId: null }, custom: '1' }, + children: [ + { + data: { id: '1.1', two: { parentId: '1' }, custom: '1.1' }, + children: [], + }, + ], +}]) + }) + it('should work with nested id and parentId properties', () => { + expect(arrayToTree( + [ + { one: { id: '1' }, two: { parentId: null }, custom: '1' }, + { one: { id: '1.1' }, two: { parentId: '1' }, custom: '1.1' }, + ], + { id: 'one.id', parentId: 'two.parentId' }, + ), + ).to.deep.equal([{ + data: { one: { id: '1' }, two: { parentId: null }, custom: '1' }, + children: [ + { + data: { one: { id: '1.1' }, two: { parentId: '1' }, custom: '1.1' }, + children: [], + }, + ], +}]) }) })