iron-tree
This package builds a tree and gives a lot of useful methods for managing a tree and its nodes
Install
npm install @denq/iron-tree --save
Base usage
const object = { id: 1, title: 'Root' };
const tree = new Tree(object);
const regularObject = { id:2, title: 'Node 2'}
tree.add((parentNode) => {
return parentNode.get('id') === 1;
}, regularObject);
const targetNode = tree.contains((currentNode) => {
return currentNode.get('id') === 2;
});
const result = tree.remove((currentNode) => {
return currentNode.get('id') === 2;
});
const criteria = (currentNode) => currentNode.get('id') === 1;
tree.traversal(criteria, (currentNode) => {
currentNode.set('some', true);
});
const criteria = (currentNode) => currentNode.get('id') === 6;
const targetNode = tree.contains(criteria);
const path = targetNode.getPath();
const pathString = path
.map((item) => item.get('id'))
.join(',');
function compareById(vector) {
return (a, b) => {
const aid = Number(a.get('id'));
const bid = Number(b.get('id'));
if (aid > bid) {
return vector ? 1 : -1;
} else if (aid < bid) {
return vector ? -1 : 1;
} else {
return 0
}
};
}
tree.sort(compareById(false));
The following are the other methods available.
Tree
This is the class of tree management.
Properties
Methods
-
contstructor(object)
- params
- object - json
object
. Optional
- return
IronTree
- example
const object = { id: 1, title: 'Root' };
const tree = new Tree(object);
-
.add(criteria, object) Adds a node to the tree if the criterion is true.
- params
- criteria(Node) -
function
or string
. If string
then criteria is "root" - object - content for the node
- return
IronTree
- examples
const object = { id: 1, title: 'Root' };
const tree = new Tree();
const resultTree = tree.add('root', object);
const regularObject = { id:2, title: 'Node 2'}
const resultTree = tree.add((parentNode) => {
return parentNode.get('id') === 1;
}, regularObject);
-
.remove(criteria) Removes a node from a tree if the criterion is true.
- params
- criteria(Node) - return
boolean
- return
boolean
- examples
const result = tree.remove((currentNode) => {
return currentNode.get('id') === 7;
});
-
.contains(criteria) Searches for a node in a tree according to the criterion.
- params
- criteria(Node) - return
boolean
- return
Node
- examples
const targetNode = tree.contains((currentNode) => {
return currentNode.get('id') === 7;
});
-
.sort(compare) Sorts a tree.
- params
- compare(a:Node, b:Node) - comparison function
- return
null
- examples
function compareById(vector) {
return (a, b) => {
const aid = Number(a.get('id'));
const bid = Number(b.get('id'));
if (aid > bid) {
return vector ? 1 : -1;
} else if (aid < bid) {
return vector ? -1 : 1;
} else {
return 0
}
};
}
tree.sort(compareById(false));
-
.move(criteria, destination) Moves the desired branch or node to the node or branch of the destination, according to the criteria.
- params
- criteria(Node) - callback
- destination(Node) - callback
- return
boolean
- examples
const search = (currentNode) => currentNode.get('id') === 7;
const destination = (currentNode) => currentNode.get('id') === 3;
const result = tree.move(search, destination);
-
.traversal(criteria, callback) Bypasses the tree and, according to the criterion, calls a function for each node.
- params
- criteria(Node) - return
boolean
- callback(Node)
- return
null
- examples
const criteria = (currentNode) => currentNode.get('id') === 7;
tree.traversal(criteria, (currentNode) => {
currentNode.set('some', true);
});
tree.traversal(null, (currentNode) => {
if (currentNode.get('id')%2 === 0) {
currentNode.set('some', true);
}
});
-
.toJson(options) Represents a tree in the form of a json format.
- params
- options -
object
. Optional
- empty_children - Type
boolean
. Allow empty children. Default true
- key_children - Type
string
. Field name for children. Default children
- return
object
- examples
const json = tree.toJson();
Node
This is the node management class.
Properties
- content Content of the node
- children Children of the node
- length Number children of the node
Methods
-
constructor(json)
- params
- json - simple
json
object
- examples
const rootContent = {
id: 1,
name: 'Root',
}
let node = new Node(rootContent);
-
.add(child) Adding a child to the node.
- return
Node
- created node - params
- examples
const rootContent = {
id: 1,
name: 'Root',
}
let node = new Node(rootContent);
const childNode = node.add({ id: 2, name: 'Two node'});
-
.remove(criteria) Removing a child node according to the criterion.
- return - removed
Node
- params
- criteria - criteria function for removing nodes
- examples
const removedNodes = node.remove((itemNode) => {
return itemNode.get('id') === 3;
})
-
.get(path) Access to node content by field name.
- return
mixed
- params
- path - key name for object in node. For example
id
or fullname
, etc...
- examples
node.get('id');
node.get('name')
-
.set(path, value) Setting a value or creating a new field in the contents of a node.
- return
boolean
- params
- path -
String
field name - value -
mixed
- examples
node.set('id', 100));
node.get('id');
-
.sort(compare) Sorting child nodes
- return
null
- params
- compare - custom function for sorting
- examples
function compareById(vector) {
return (a, b) => {
const aid = Number(a.get('id'));
const bid = Number(b.get('id'));
if (aid > bid) {
return vector ? 1 : -1;
} else if (aid < bid) {
return vector ? -1 : 1;
} else {
return 0
}
};
}
node.sort(compareById(false));
-
.traversal(criteria, callback) Bypassing child nodes according to the criterion and applying function to them.
- return
null
- params
- criteria -
function
criteria each nodes - callback -
function
fire when criteria is true for node
- examples
node.traversal(null, (currentNode) => {
const name = currentNode.get('name');
currentNode.set('name', `${name}!`);
});
node.traversal((currentNode) => currentNode.get('id') === 3, (currentNode) => {
const name = currentNode.get('name');
currentNode.set('name', `${name}!`);
});
-
.getPath() This method return array Nodes from root node
to current node
. It maybe helpful for breadcrumbs.
const path = targetNode.getPath();
const pathString = path
.map((item) => item.get('id'))
.join(',');
TDD
npm test