#README

因为最近常用到字典树，所以自己封装一个易用的字典树库。
代码量很少，90行，使用 generator 来遍历字典树，写起来很舒服。

## install

基本上我写的库如果有重名的，都会加上 haha，😆。

```bash
npm install haha-dict-tree --save
```

## quick start

实现一个按搜索热度排序拥有相同前缀的功能。

```js
const Tree = require('haha-dict-tree');
const t = new Tree();
t.addWord('你');
t.addWord('你好');// 每次搜索添加一次
t.addWord('你好');
t.addWord('你好啊');
t.addWord('你好啊');
t.addWord('你好啊');
t.addWord('测试');
t.addWord('测试');
t.addWord('测试');
const result = [];
for (let n of t.findAfter('你')) {
  result.push(n);
}

result.sort((a, b) => b.number - a.number).map(n => console.log(n.word, n.number));
// 你好啊 4
// 你好 3
// 你 2
```

## API

### Tree

```
const Tree = require('haha-dict-tree');
const t = new Tree();
```

### Node
- *char* 节点字符
- *word* 节点字符串
- *deep* 节点深度
- *number* 节点热度

```js
const Tree = require('haha-dict-tree');
const t = new Tree();
t.addWord('12');
for(let n of t.findAfter('1')) {
  console.log(n);
}

// Node {
//   char: '2',
//   word: '12',
//   isWord: true,
//   deep: 2,
//   number: 1,
//   nextMap: Map {} }
```

#### Tree.addWord(word)

- *word* String

添加字符串

```js
const Tree = require('haha-dict-tree');
const t = new Tree();
t.addWord('123');
```

#### Tree.findAllRaw(word)

- *word* String

查询字符串，返回遍历路径。
路径长度比查询字符串小时候，按照字符串查询。
路径长度大于字符串长度的时候，广度遍历接下来的节点。

```js
const Tree = require('haha-dict-tree');
const t = new Tree();
t.addWord('1234');
for(let n of t.findAllRaw('1')) {
  console.log(n.word);
}
// result:
// 1
// 12
// 123
// 1234
```

### Tree.findAll(word)

- *word* String

对 findAllRaw 包装了一层，只返回拥有添加字符串的节点，而不是所有经过节点。

```js
const Tree = require('haha-dict-tree');
const t = new Tree();
t.addWord('1234');
t.addWord('12');
for(let n of t.findAllRaw('1')) {
  console.log(n.word);
}
// result:
// 12
// 1234
```

### Tree.findBefore(word)

- *word* String

对 findAll包装了一层，返回长度小于等于查询字符串的完整字符串节点。

```js
const Tree = require('haha-dict-tree');
const t = new Tree();
t.addWord('1234');
t.addWord('12');
t.addWord('1');
for(let n of t.findAllRaw('123')) {
  console.log(n.word);
}
// result:
// 1
// 12
```

### Tree.findBefore(word)

- *word* String

对 findAll包装了一层，返回长度大于等于查询字符串的完整字符串节点。

```js
const Tree = require('haha-dict-tree');
const t = new Tree();
t.addWord('12345');
t.addWord('1234');
t.addWord('12');
t.addWord('1');
for(let n of t.findAllRaw('123')) {
  console.log(n.word);
}
// result:
// 1234
// 12345
```
