js-tree-list
Convert list to tree, managing a tree and its nodes.
Fork from:
https://github.com/DenQ/iron-tree
https://github.com/DenQ/list-to-tree
The author of this project is DenQ. This project has only been improved a little.
Features
- Convert list to tree.
- Convert tree to list.
- Tree sort by last.
- UUID is support.
Installation
$ npm install js-tree-list
Usage
const defaultOptions = {
key_id: 'id',
key_parent: 'parent',
key_child: 'child',
key_last: null,
uuid: false,
empty_children: false
}
import JsTreeList from "js-tree-list"
var list = [
{
id: 1,
parent: 0
},
{
id: 2,
parent: 1
},
{
id: 3,
parent: 1
},
{
id: 4,
parent: 2
},
{
id: 5,
parent: 2
},
{
id: 6,
parent: 0
},
{
id: 7,
parent: 0
},
{
id: 8,
parent: 7
},
{
id: 9,
parent: 8
},
{
id: 10,
parent: 0
}
]
const tree = new JsTreeList.ListToTree(list, {
key_id: "id",
key_parent: "parent",
key_child: "children",
key_last: "last"
}).GetTree()
const list = new JsTreeList.TreeToList(tree, {
key_child: "children",
empty_children: true
}).GetList()
console.log(tree)
console.log(list)
Result
[{
"id": 1,
"parent": 0,
"child": [
{
"id": 2,
"parent": 1,
"child": [
{
"id": 4,
"parent": 2
}, {
"id": 5,
"parent": 2
}
]
},
{
"id": 3,
"parent": 1
}
]
}, {
"id": 6,
"parent": 0
}, {
"id": 7,
"parent": 0,
"child": [
{
"id": 8,
"parent": 7,
"child": [
{
"id": 9,
"parent": 8
}
]
}
]
}, {
"id": 10,
"parent": 0
}];
Methods
- constructor(list, options)
- params:
list
- array list with elements. Like { id: 5: parent: 1 }
.options
- optional parameter. Object for describe flags and field names for tree.
- .GetTree() This method will be return json tree
- .sort(callback) The custom sort method
The Tree and Node Base usage
import JsTreeList from "js-tree-list"
const object = { id: 1, title: "Root" }
const tree = new JsTreeList.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)
})
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
Three
- example
const object = { id: 1, title: "Root" }
const tree = new JsTreeList.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
Three
- examples
const object = { id: 1, title: "Root" }
const tree = new JsTreeList.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
import JsTreeList from "js-tree-list"
const rootContent = {
id: 1,
name: "Root"
}
let node = new JsTreeList.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 JsTreeList.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}!`)
}
)