# 树节点的操作方法集合(类似于操作数组)


## API

- [Base](#base)
    - [treeEach: 树遍历](#treeeach)
    - [treeFilter: 树过滤](#treefilter)
    - [treeFind: 树查找](#treefind)
    - [treeMap: 树map](#treemap)

通用参数:

| 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`                           | `{ children: string }`                              | tree node's 'children', 'parent' and 'id' key name                                             |


### treeEach

`treeEach(data, callback, props)` tree node each(like `Array.prototype.forEach`).

recursive will break until callback is false.

```js
import { treeEach } from "@ksconsole/share";

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 "@ksconsole/share";

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 "@ksconsole/share";

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 "@ksconsole/share";

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' }
```
