2.0.6 • Published 2 years ago

@vahaha/treejs v2.0.6

Weekly downloads
176
License
MIT
Repository
github
Last release
2 years ago

Usage

const Tree = require('@vahaha/treejs');

const arrTreeJs = Tree.fromNodes(nodes, options); // array of TreeJS objects
const tree = arrTreeJs[0].tree // tree json

Optional object

  • key (default 'id'): field name is key.
  • parentKey (default 'parentId'): field name is parent key
  • childrenKey (default 'children'): field name is children key.
  • sort: function is used to sort nodes (ex: (a, b) => a.id > b.id ? 1 : -1)

(caution: we distinguish data type of id, Mongodb ObjectId must be convert to string before build tree)

const Tree = require('@vahaha/treejs');
const nodes = [
    {"_id": "1", "name": "Root 1"},
    {"_id": "2", "name": "Branch 1", "pId": "1"},
];

// use options object
const arrTreeJs = Tree.fromNodes(nodes, {
    key: '_id',
    parentKey: 'pId',
    sort: (a, b) => a._id > b._id ? 1 : -1 
}); // always return an array

const objTree = arrTreeJs[0] // TreeJS object
const tree = objTree.tree // tree json

Tree's functions:

const Tree = require('@vahaha/treejs');
const nodes = [
    {"id": "1", "name": "Root 1"},
    {"id": "2", "name": "Branch 1", "parentId": "1"},
    {"id": "3", "name": "Branch 2", "parentId": "1"},
    {"id": "4", "name": "Branch 3", "parentId": "1"},
    {"id": "5", "name": "Leaf 1", "parentId": "3"},
    {"id": "6", "name": "Leaf 2", "parentId": "3"}
];

/*
Tree:
    1: Root 1
    |- 2: Branch 1
    |- 3: Branch 2
       |- 5: Leaf 1
       |- 6: Leaf 2
    |- 4: Branch 3
*/

// use options object
const arrTreeJs = Tree.fromNodes(nodes);

const objTree = arrTreeJs[0]

// get a Branch
const branch = objTree.getBranch("3")
// result {id: "3", "name", "Branch 2", "parentId": "1", children: [{id: "5", ...}, {id: "6", ...}]},

// get all nodes of a branch
const branchNodes = objTree.getNodesOfBranch("3")
// [
//    {id: "3", "name", "Branch 2", "parentId": "1", children: [...]},
//    {id: "5", "name", "Leaf 1", "parentId": "3"},
//    {id: "6", "name", "Leaf 2", "parentId": "3"}
// ]

// get a node by id
const node = objTree.getNode("3")
// result such as getBranch: {id: "3", "name", "Branch 2", "parentId": "1", children: [{id: "5", ...}, {id: "6", ...}]}

TreeNode's functions:

const Tree = require('@vahaha/treejs');
const nodes = [
    {"id": "1", "name": "Root 1"},
    {"id": "2", "name": "Branch 1", "parentId": "1"},
    {"id": "3", "name": "Branch 2", "parentId": "1"},
    {"id": "4", "name": "Branch 3", "parentId": "1"},
    {"id": "5", "name": "Leaf 1", "parentId": "3"},
    {"id": "6", "name": "Leaf 2", "parentId": "3"}
];

/*
Tree:
    1: Root 1
    |- 2: Branch 1
    |- 3: Branch 2
       |- 5: Leaf 1
       |- 6: Leaf 2
    |- 4: Branch 3
*/

// use options object
const arrTreeJs = Tree.fromNodes(nodes);
const objTree = arrTreeJs[0]
// get a node by id
const node = objTree.getNode("5")

const pathToRoot = node.getPath() // ["3", "1"]
const parent = node.getParent() // {id: "3", "name", "Branch 2", "parentId": "1", children: [{id: "5", ...}, {id: "6", ...}]}

References:

  • fromNodes function: build trees from array of nodes (return array of TreeJS objects)
  • TreeJS object:
    • property:
      • tree: tree json
    • functions:
      • construction(tree): init TreeJS object from a tree json
      • getBranch(id): get branch (sub tree) from a node
      • getNodesOfBranch(id): get all nodes are descendant of a node. Result include current node.
      • getNode(id): get a node by id. (alias getBranch)
      • getAllNodes(): get all nodes of tree
  • TreeNode object:
    • properties:
      • cloned properties of your node
      • childrenKey: contains child nodes
    • functions:
      • getPath(): get path direct to root. This function return array of nodes id from parent up to root.
      • getParent(): get parent of current node
      • setParent(parent: TreeNode): set parent of current node. This action also adds current node to children list of parent.
      • addChild(...children): add child/children to node.This action also sets current node as parent of added child/children
      • inheritPath(): refresh path of current node by inherit from parent
      • visitAncestors(): refresh path by visit all ancestors
      • visitDescendants(): refresh path of all descendants

Old version <= 1.1.4


const Tree = require('@vahaha/treejs');

const tree = Tree.buildTree(nodes, keyName, parentFieldName, options);

Options

Optional object

  • childrenFieldName ('children' is default): custom children field name.
  • cloneDeep (false is default): if true, it'll clone deep array of nodes.

Example:

var Tree = require('@vahaha/treejs');

const nodes = [
    {"id": "1", "name": "Root 1"},
    {"id": "2", "name": "Root 2"},
    {"id": "3", "name": "Branch 1", "parentId": "1"},
    {"id": "4", "name": "Branch 2", "parentId": "2"},
    {"id": "5", "name": "Branch 3", "parentId": "1"},
    {"id": "6", "name": "Leaf 1", "parentId": "3"},
    {"id": "7", "name": "Leaf 2", "parentId": "3"}
];

const keyName = "id";
const parentFieldName = "parentId";

const tree = Tree.buildTree(nodes, keyName, parentFieldName)

/* result:
[
    {
        "id": "2",
        "name": "Root 2",
        "children": [
            {"id": "4", "name": "Branch 2", "parentId": "2"}
        ]
    },
    {
        "id": "1",
        "name": "Root 1",
        "children": [
            {"id": "5", "name": "Branch 3", "parentId": "1"},
            {"id": "3", "name": "Branch 1", "parentId": "1",
                "children": [
                    {"id": "6", "name": "Leaf 1", "parentId": "3"},
                    {"id": "7", "name": "Leaf 2", "parentId": "3"}
                ]
            }
        ]
    }
]
*/

const tree2 = Tree.buildTree(nodes, keyName, parentFieldName, {childrenFieldName: 'nodes'})

/* result:
[
    {
        "id": "2",
        "name": "Root 2",
        "nodes": [  // using 'nodes' instead of 'children'
            {"id": "4", "name": "Branch 2", "parentId": "2"}
        ]
    },
    {
        "id": "1",
        "name": "Root 1",
        "nodes": [  // using 'nodes' instead of 'children'
            {"id": "5", "name": "Branch 3", "parentId": "1"},
            {"id": "3", "name": "Branch 1", "parentId": "1",
                "nodes": [  // using 'nodes' instead of 'children'
                    {"id": "6", "name": "Leaf 1", "parentId": "3"},
                    {"id": "7", "name": "Leaf 2", "parentId": "3"}
                ]
            }
        ]
    }
]
*/
2.0.6

2 years ago

2.0.3

2 years ago

2.0.5

2 years ago

2.0.4

2 years ago

2.0.2

3 years ago

1.1.4

3 years ago

2.0.1

3 years ago

2.0.0

3 years ago

1.1.3

3 years ago

1.1.2

3 years ago

1.1.1

3 years ago

1.1.0

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago