nestedsetsjs
Version:
Nested sets structure with separated items and nodes
2 lines (1 loc) • 3.49 kB
JavaScript
module.exports=function(){var e={Structure:[],Data:{},setItem:(t,r)=>{e.Data[t]=r},removeItem:t=>{if(void 0!==e.Data[t]){for(var r=0;r<e.Structure.length;r++)e.Structure[r].itemId===t&&e.removeNode(e.Structure[r]._id);delete e.Data[t]}},addRoot:t=>(void 0!==e.Data[t]&&(e.removeNodes(),e.Structure.push({_id:1,lkey:1,rkey:2,depth:1,childs:0,parentId:0,itemId:t})),e.Structure[0]._id),addNode:(t,r)=>{if(void 0!==e.Data[r]){var y=e.getNode(t,!0);if(!y)return!1;var u=Math.max(...e.Structure.map(e=>e._id))||0;return e.Structure=e.Structure.map(e=>(e.lkey>y.rkey&&(e.lkey+=2,e.rkey+=2),e.rkey>=y.rkey&&e.lkey<y.rkey&&(e.rkey+=2,e.childs++),e)),e.Structure.push({_id:u+1,lkey:y.rkey,rkey:y.rkey+1,depth:y.depth+1,childs:0,parentId:y._id,itemId:r}),u+1}},getNode:function(e,t){var r=this.Structure.filter(t=>t._id===e);return!(!Array.isArray(r)||1!==r.length)&&(!0===t?{...r[0]}:r[0])},removeNode:function(t){var r=e.getNode(t,!0),y=e.getChilds(t).length+1;return!!r&&(e.Structure=e.getNodes().map(e=>(e.rkey>r.rkey&&e.lkey<r.lkey&&(e.childs=e.childs-y),e)).filter(e=>!(e.lkey>=r.lkey&&e.rkey<=r.rkey)).map(e=>(e.rkey>r.rkey&&(e.lkey=e.lkey>r.lkey?e.lkey-(r.rkey-r.lkey+1):e.lkey,e.rkey=e.rkey-(r.rkey-r.lkey+1)),e)),e.Structure)},moveNode:function(t,r){var y,u=e.getNode(t,!0),k=e.getNode(r,!0),d=u.depth,a=u.rkey,n=u.lkey,l=k.depth,i=k.rkey-1,o=l-d+1,c=a-n+1;i>a?(y=i-n+1-c,e.Structure=e.Structure.map(e=>(e.lkey<=i&&e.rkey>n&&(e.rkey<=a?e.lkey=e.lkey+y:e.lkey>a&&(e.lkey=e.lkey-c),e.rkey<=a&&(e.depth=e.depth+o),e.rkey<=a?e.rkey=e.rkey+y:e.rkey<=i&&(e.rkey=e.rkey-c)),e))):(y=i-n+1,e.Structure=e.Structure.map(e=>(e.rkey>i&&e.lkey<a&&(e.lkey>=n?e.rkey=e.rkey+y:e.rkey<n&&(e.rkey=e.rkey+c),e.lkey>=n&&(e.depth=e.depth+o),e.lkey>=n?e.lkey=e.lkey+y:e.lkey>i&&(e.lkey=e.lkey+c)),e)))},getNodes:function(){return e.Structure.sort((e,t)=>e.lkey-t.lkey)},removeNodes:function(){e.Structure=[]},getParent:function(t){var r=e.getParents(t);return void 0!==r[r.length-1]&&r[r.length-1]},getParents:function(t){var r=e.getNode(t,!0);return r?e.getNodes().filter(e=>e.lkey<r.lkey&&e.rkey>r.rkey).map(t=>(t.data=e.Data[t.itemId],t)):[]},getChilds:function(t,r){var y=e.getNode(t,!0);return y?e.getNodes().filter(e=>e.lkey>=y.lkey&&e.rkey<=y.rkey&&t!==e._id&&(void 0===r||e.depth<=y.depth+r)).map(t=>(t.data=e.Data[t.itemId],t)):[]},getBranch:function(t){var r=e.getNode(t);return r?e.getNodes().filter(e=>e.rkey>r.lkey&&e.lkey<r.rkey).map(t=>(t.data=e.Data[t.itemId],t)):[]},getTree:function(){return e.getNodes().map(t=>(t.data=e.Data[t.itemId],t))},clearAll:function(){e.Structure=[],e.Data={}},isRoot:function(t){var r=e.getNode(t);return r&&0===r.parentId},isBranch:function(t){var r=e.getNode(t);return r&&r.childs>0},isLeaf:function(t){var r=e.getNode(t);return r&&0===r.childs},getMaxRightKey:function(){return Math.max(...e.Structure.map(e=>e.rkey))},getMaxLeftKey:function(){return Math.max(...e.Structure.map(e=>e.lkey))},getCountNodes:function(){return e.Structure.length},checkTree:function(){var t=e.Structure.filter(e=>e.lkey>=e.rkey),r=e.Structure.filter(e=>(e.rkey-e.lkey)%2==0),y=e.Structure.filter(e=>(e.lkey-e.depth+2)%2==1),u=[];return 0!==t.length&&u.push({LeftLessRight:t}),0!==r.length&&u.push({ModKeys:r}),0!==y.length&&u.push({Depth:y}),u},debug:function(){return e.getNodes().map(t=>String(" ").repeat(t.depth+1)+"> "+JSON.stringify(e.Data[t.itemId])+"(itemId:"+t.itemId+"; nodeId:"+t._id+"; lkey:"+t.lkey+"; rkey:"+t.rkey+"; depth:"+t.depth+"; childs:"+t.childs+")")}};return e};