operation-tree-node
Version:
Operation method collection for tree node(like operation array).
339 lines (248 loc) • 9.91 kB
Markdown
Operation method collection for tree node(like operation array).
## Usage
- Install
```
npm install --save operation-tree-node
```
## API
- [Base](#base)
- [treeEach: each tree nodes](#treeeach)
- [treeFilter: filter tree nodes](#treefilter)
- [treeMap: replace tree node](#treemap)
- [treeFind: find tree node](#treefind)
- [treeToFlatArray: to flat array](#treetoflatarray)
- [Advance](#advance)
- [treeSort: sort tree nodes](#treesort)
- [treeCheck: check tree nodes](#treecheck)
- [treeEachParent: parent node each](#treeeachparent)
- [treeFindParent: find node parent](#treefindparent)
- [treeMerge: merge same nodes](#treemerge)
- [treeAppendParent: append parent link](#treeappendparent)
- [treeAppendLevel: append tree node level](#treeappendlevel)
- [treeNodeLevel: get node level](#treenodelevel)
common arguments:
| name | type | description |
| ---------- | --------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| `data` | `object[]` | example: `[{ id: 1, name: "1", children: [{ id: 2, name: "2" }] }]` |
| `callback` | `(node, index, arr, parent) => boolean/object/void` | node: tree node, index: parent children's index,<br> arr: parent children, parent: parent node |
| `props` | `{ id: string, children: string, parent: string }` | tree node's 'children', 'parent' and 'id' key name |
### Base
### treeEach
`treeEach(data, callback, props)` tree node each(like `Array.prototype.forEach`).
recursive will break until callback is false.
```js
import { treeEach } from "operation-tree-node";
const treeData1 = [{ id: 1, name: "1", children: [{ id: 2, name: "2" }] }];
treeEach(treeData1, (node, index, arr, parent) => {
console.log(node.name, index, arr, parent);
});
// '1', 0, [treeData], undefined
// '2', 0, [treeData[0].children], [treeData[0]]
// use children props
const treeData2 = [{ id: 1, name: "1", child: [{ id: 2, name: "2" }] }];
treeEach(treeData2, console.log, { children: "child" });
```
### treeFilter
`treeFilter(data, callback, props, isStrictly)` tree node filter(like `Array.prototype.filter`).
get a new data instead of change source.
```js
import { treeFilter } from "operation-tree-node";
const treeData = [
{ id: 1, name: "1", child: [{ id: 2, name: "2" }] },
{ id: 3, name: "3" },
];
const result = treeFilter(treeData, (node) => node.id === 2, {
children: "child",
});
console.log(result);
// [{ id: 1, name: '1', child: [{ id: 2, name: '2' }] }]
```
### treeMap
`treeMap(data, callback, props)` tree node map(like `Array.prototype.map`).
get a new data instead of change source.
```js
import { treeMap } from "operation-tree-node";
const treeData = [{ id: 1, name: "1", children: [{ id: 2, name: "2" }] }];
// tree node's +1
const newData = treeMap(treeData, (node) => ({
id: node.id + 1,
name: node.name,
...(node.children ? { children: node.children } : {}),
}));
console.log(newData);
// [{ id: 2, name: '1', children: [{ id: 3, name: '2' }] }]
```
### treeFind
`treeFind(data, callback, props)` tree node find(like `Array.prototype.find`).
recursive will break until found.
```js
import { treeFind } from "operation-tree-node";
const treeData = [
{ id: 1, name: "1", children: [{ id: 2, name: "2" }] },
{ id: 1, name: "1", children: [{ id: 2, name: "2" }] },
];
const find = treeFind(treeData, (node) => node.id === 2);
console.log(find);
// { id: 2, name: '2' }
```
### treeToFlatArray
`treeToFlatArray(data, callback, props)` tree to flat array.
get a flat array and source data structure is not change.
```js
import { treeToFlatArray } from "operation-tree-node";
const treeData = [{ id: 1, name: "1", children: [{ id: 2, name: "2" }] }];
const result = treeToFlatArray(treeData);
console.log(result);
// [
// { id: 1, name: '1', children: [{ id: 2, name: '2' }] },
// { id: 2, name: '2' }
// ]
```
### Advance
### treeSort
`treeSort(data, callback, props)` tree node sort(like `Array.prototype.sort`).
get a new data instead of change source.
| name | type | description |
| ---------- | ----------------------------------- | -------------------------------------------------- |
| `data` | (same) | (same) |
| `callback` | `(currentNode, nextNode) => number` | currentNode/nextNode: tree node, compare with them |
| `props` | (same) | (same) |
```js
const treeData = [
{
id: 1,
name: "1",
children: [
{ id: 3, name: "3" },
{ id: 2, name: "2" },
],
},
];
// 1,3,2 => 1,2,3
const newData = treeSort(
treeData,
(currentNode, nextNode) => currentNode.id - nextNode.id
);
console.log(newData);
// [
// {
// id: 1,
// name: '1',
// children: [{ id: 2, name: '2' }, { id: 3, name: '3' }]
// }
// ]);
```
### treeCheck
`treeCheck(data, checkIds, props)` tree node check.
get all associated node'id by check one node.
| name | type | description |
| ---------- | ------------------- | --------------------- |
| `data` | (same) | (same) |
| `checkIds` | `number[]/string[]` | will checked node ids |
| `props` | (same) | (same) |
```js
import { treeCheck } from "operation-tree-node";
const treeData = [{ id: 1, name: "123", children: [{ id: 2, name: "2" }] }];
const resultIds = treeCheck(treeData, [2], {
id: "id",
children: "children",
parent: "parent",
});
console.log(resultIds);
// [2, 1]
```
### treeEachParent
`treeEachParent(data, callback, props)` tree node each parent.
recursive will break until callback is false.
| name | type | description |
| ---------- | -------------------------- | ---------------------------------------------------------- |
| `data` | (same) | (same) |
| `callback` | `(parent) => void/boolean` | parent: parent node, if callback false, skip parent.parent |
| `props` | (same) | (same) |
```js
import { treeEachParent } from "operation-tree-node";
const treeData = [
{ id: 1, name: "123", children: [{ id: 2, name: "2", parent: null }] },
];
treeData[0].children[0].parent = treeData[0];
const names = [];
treeEachParent(treeData[0].children, (parent) => !!names.push(parent.name));
console.log(names);
// ['123']
```
### treeFindParent
`treeFindParent(node, callback, props)` tree node find parent.
```js
import { treeFindParent } from "operation-tree-node";
const treeData = [
{
id: 1,
name: "123",
parent: null,
children: [{ id: 2, name: "2", parent: null, children: [] }],
},
];
treeData[0].children[0].parent = treeData[0];
const find = treeFindParent(treeData[0].children[0], (node) => node.id === 1);
console.log(find);
// { id: 1, name: '123', children: ... }
```
### treeMerge
`treeMerge(data, callback, props)` tree node merge(same level).
get a new data instead of change source.
| name | type | description |
| ---------- | ------------------------------------ | -------------------------------------------------- |
| `data` | (same) | (same) |
| `callback` | `(currentNode, nextNode) => boolean` | currentNode/nextNode: tree node, compare with them |
| `props` | (same) | (same) |
```js
import { treeMerge } from "operation-tree-node";
const treeData = [
{ id: 1, name: "1", type: "1", children: [{ id: 2, name: "2" }] },
{ id: 3, name: "3", type: "1", children: [{ id: 4, name: "4" }] },
];
const result = treeMerge(
treeData,
(curr, next) => curr.type && curr.type === next.type
);
console.log(result);
// [
// {
// id: 1,
// name: '1',
// type: '1',
// children: [{ id: 2, name: '2' }, { id: 4, name: '4' }]
// }
// ]
```
### treeAppendParent
`treeAppendParent(data, props)` append `parent` to each tree node.
the `parent` is a non-enumerable property, and the method will change the source.
```js
import { treeAppendParent } from "operation-tree-node";
const treeData = [{ id: 1, name: "1", children: [{ id: 2, name: "2" }] }];
treeAppendParent(treeData);
console.log(treeData);
// [{ id: 1, name: '1', parent: null, children: [{ id: 2, name: '2', parent: {} }] }]
```
### treeAppendLevel
`treeAppendLevel(data, props)` append `level` to each tree node.
the `level` is a non-enumerable property, and the method will change the source.
```js
import { treeLevelParent } from "operation-tree-node";
const treeData = [{ id: 1, name: "1", children: [{ id: 2, name: "2" }] }];
treeAppendLevel(treeData);
console.log(treeData);
// [{ id: 1, name: '1', level: 0, children: [{ id: 2, name: '2', level: 1 }] }]
```
### treeNodeLevel
`treeNodeLevel(node, props)` get tree node level.
the method needs `parent` link, and level start with 0.
```js
import { treeAppendParent, treeNodeLevel } from "operation-tree-node";
const treeData = [{ id: 1, name: "1", children: [{ id: 2, name: "2" }] }];
// link parent
treeAppendParent(treeData);
const level = treeNodeLevel(treeData[0]); // 0
const level = treeNodeLevel(treeData[0].children[0]); // 1
```