This package builds a tree and gives a lot of useful methods for managing a tree and its nodes
npm install @denq/iron-tree --save
// create tree
const object = { id: 1, title: 'Root' };
const tree = new Tree(object);
// add nodes
const regularObject = { id:2, title: 'Node 2'}
tree.add((parentNode) => {
return parentNode.get('id') === 1;
}, regularObject);
// contains node
const targetNode = tree.contains((currentNode) => {
return currentNode.get('id') === 2;
});
// remove node
const result = tree.remove((currentNode) => {
return currentNode.get('id') === 2;
});
// traversal
const criteria = (currentNode) => currentNode.get('id') === 1;
tree.traversal(criteria, (currentNode) => {
currentNode.set('some', true);
});
// getPath
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)); // desc
The following are the other methods available.
This is the class of tree management.
- rootNode Root tree node
- type
Node
- type
-
contstructor(object)
- params
- object - json
object
. Optional
- object - json
- return
IronTree
- example
const object = { id: 1, title: 'Root' }; const tree = new Tree(object);
- params
-
.add(criteria, object) Adds a node to the tree if the criterion is true.
- params
- criteria(Node) -
function
orstring
. Ifstring
then criteria is "root" - object - content for the node
- criteria(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);
- params
-
.remove(criteria) Removes a node from a tree if the criterion is true.
- params
- criteria(Node) - return
boolean
- criteria(Node) - return
- return
boolean
- examples
const result = tree.remove((currentNode) => { return currentNode.get('id') === 7; });
- params
-
.contains(criteria) Searches for a node in a tree according to the criterion.
- params
- criteria(Node) - return
boolean
- criteria(Node) - return
- return
Node
- examples
const targetNode = tree.contains((currentNode) => { return currentNode.get('id') === 7; });
- params
-
.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)); //Desc
- params
-
.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);
- params
-
.traversal(criteria, callback) Bypasses the tree and, according to the criterion, calls a function for each node.
- params
- criteria(Node) - return
boolean
- callback(Node)
- criteria(Node) - return
- 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); } });
- params
-
.toJson(options) Represents a tree in the form of a json format.
- params
- options -
object
. Optional- empty_children - Type
boolean
. Allow empty children. Defaulttrue
- key_children - Type
string
. Field name for children. Defaultchildren
- empty_children - Type
- options -
- return
object
- examples
const json = tree.toJson();
- params
This is the node management class.
- content Content of the node
- type
object
- type
- children Children of the node
- type
array
- type
- length Number children of the node
- type
number
- type
-
constructor(json)
- params
- json - simple
json
object
- json - simple
- examples
const rootContent = { id: 1, name: 'Root', } let node = new Node(rootContent);
- params
-
.add(child) Adding a child to the node.
- return
Node
- created node - params
- child - type
object
/json
- child - type
- examples
const rootContent = { id: 1, name: 'Root', } let node = new Node(rootContent); const childNode = node.add({ id: 2, name: 'Two node'});
- return
-
.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; })
- return - removed
-
.get(path) Access to node content by field name.
- return
mixed
- params
- path - key name for object in node. For example
id
orfullname
, etc...
- path - key name for object in node. For example
- examples
node.get('id'); // 1 node.get('name') // "Some name"
- return
-
.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
- path -
- examples
node.set('id', 100)); // returned `true`. Node.content.id = 100 node.get('id'); // 100
- return
-
.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));
- return
-
.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
- criteria -
- examples
// for all nodes node.traversal(null, (currentNode) => { const name = currentNode.get('name'); currentNode.set('name', `${name}!`); // Last symbol "!" });
// only for node.id == 3 node.traversal((currentNode) => currentNode.get('id') === 3, (currentNode) => { const name = currentNode.get('name'); currentNode.set('name', `${name}!`); // Last symbol "!" });
- return
-
.getPath() This method return array Nodes from
root node
tocurrent node
. It maybe helpful for breadcrumbs.- return
Array
- exampels
const path = targetNode.getPath(); const pathString = path .map((item) => item.get('id')) .join(','); // 1,3,4,5,6
- return
npm test