# js-jksearcher
**Repository Path**: jinko/js-jksearcher
## Basic Information
- **Project Name**: js-jksearcher
- **Description**: Javascript 字符串搜索器,支持拼音搜索, 全拼简拼混合中文字母数字等
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-01-14
- **Last Updated**: 2022-07-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 字符串搜索工具
支持拼音(全拼, 简拼, 多音字), 以及拼音中文字母数字混合搜索
## 全局对象
全局对象为 `window.JKSearcher`
## 用法用例
### 直接搜索
```javascript
//返回匹配的第一个的下标 [0,1]
JKSearcher.search('你好吗', 'nh');
```
```javascript
//返回匹配的所有下标 [[0,1]]
JKSearcher.search('你好吗', 'nh', {
//匹配所有项目
all: true,
//区分大小写
sensitive: true
});
```
```javascript
//返回匹配的所有内容
//以下返回: ["你好", "你很"]
JKSearcher.match('你好吗, 你很厉害', 'nh', {
//匹配所有项目
all: true,
//区分大小写
sensitive: true
});
```
```javascript
//高亮所有匹配项, 默认追加
//以下返回: 你好吗, 你很厉害
JKSearcher.highlight('你好吗, 你很厉害', 'nh', {
//匹配所有项目
all: true,
//区分大小写
sensitive: true
});
```
```javascript
//自定义高亮所有匹配项
//以下返回: 你好吗, 你很厉害
JKSearcher.highlight('你好吗, 你很厉害', 'nh', {
//匹配所有项目
all: true,
//区分大小写
sensitive: true,
//自定义高亮回调
callback: row => `${row}`
});
```
### 创建索引, 并通过索引来搜索
搜索方法和上面类似
```javascript
//返回匹配的第一个的下标 [0,1]
let s = JKSearcher.createIndexes('你好吗');
s.search('nh');
```
```javascript
//返回匹配的所有下标 [[0,1]]
let s = JKSearcher.createIndexes('你好吗');
s.search('nh', {
//匹配所有项目
all: true,
//区分大小写
sensitive: true
});
```
```javascript
//返回匹配的所有内容
//以下返回: ["你好", "你很"]
let s = JKSearcher.createIndexes('你好吗, 你很厉害');
s.match('nh', {
//匹配所有项目
all: true,
//区分大小写
sensitive: true
});
```
```javascript
//返回匹配的所有下标
let s = JKSearcher.createIndexes('你好吗, 你很厉害');
//高亮所有匹配项, 默认追加
//以下返回: 你好吗, 你很厉害
s.highlight('nh', {
//匹配所有项目
all: true,
//区分大小写
sensitive: true
});
```
从索引中获取原来的字符串
> JKSearcher.createIndexes() 的第二个参数如果指定为true则不会有原来的字符串, 同时也不支持 match 和 highlight 方法
```javascript
let s = JKSearcher.createIndexes('你好吗, 你很厉害');
//以下输出 "你好吗, 你很厉害"
console.log(s.raw);
```
### 创建数据集合
```javascript
//指定数据
let data = [
{
"id": 10091056,
"name": "Movic 咒术回战 0 狗卷棘 角色徽章(全6款)",
"brandName": "Movic"
},
{
"id": 10086261,
"name": "异界三重奏 超神降临 限时体验 SSR魔力赏",
"brandName": " F:NEX"
},
{
"id": 10091080,
"name": "散爆 云图计划 音乐盛典 像素头像抱枕",
"brandName": "散爆"
},
];
//创建数据集合
let dataSet = JKSearcher.createDataSet(data);
/**
* 搜索指定关键字, 并高亮匹配项, 并将高亮的结果存在 hiname 字段中
*/
let matchedData = dataSet.search('yunt计划', {
all:true,
//区分大小写
sensitive:true,
//搜索字段
labelKey: 'name',
highlightCallback:a=>`${a}`,
//高亮后保存的字段
highlightSaveKey: 'hiname',
highlight: true,
});
//以下输出
/*
[
{
"id": 10091080,
"name": "散爆 云图计划 音乐盛典 像素头像抱枕",
"brandName": "散爆",
"hiname": "散爆 云图计划 音乐盛典 像素头像抱枕"
}
]
*/
console.log(JSON.stringify(matchedData, 0, 4));
//更新数据
dataSet.updateData([
{
"id": 10091056,
"name": "Movic 咒术回战 0 狗卷棘 角色徽章(全6款)",
"brandName": "Movic"
},
{
"id": 10086261,
"name": "异界三重奏 超神降临 限时体验 SSR魔力赏",
"brandName": " F:NEX"
},
{
"id": 10091080,
"name": "散爆 云图计划 音乐盛典 像素头像抱枕",
"brandName": "散爆"
},
{
"id": 10086261,
"name": "异界三重奏 超神降临 限时体验 SSR魔力赏",
"brandName": " F:NEX",
},
{
"id": 10091080,
"name": "散爆 云图计划 音乐盛典 像素头像抱枕",
"brandName": "散爆",
},
]);
/**
* 重新搜索
*/
matchedData = dataSet.search('xs', {
all:true,
//区分大小写
sensitive:true,
//搜索字段
labelKey: 'name',
highlightCallback:a=>`${a}`,
//高亮后保存的字段
highlightSaveKey: 'hiname',
highlight: true,
});
//以下输出
/*
[
{
"id": 10086261,
"name": "异界三重奏 超神降临 限时体验 SSR魔力赏",
"brandName": " F:NEX",
"hiname": "异界三重奏 超神降临 限时体验 SSR魔力赏"
},
{
"id": 10091080,
"name": "散爆 云图计划 音乐盛典 像素头像抱枕",
"brandName": "散爆",
"hiname": "散爆 云图计划 音乐盛典 像素头像抱枕"
},
{
"id": 10086261,
"name": "异界三重奏 超神降临 限时体验 SSR魔力赏",
"brandName": " F:NEX",
"hiname": "异界三重奏 超神降临 限时体验 SSR魔力赏"
},
{
"id": 10091080,
"name": "散爆 云图计划 音乐盛典 像素头像抱枕",
"brandName": "散爆",
"hiname": "散爆 云图计划 音乐盛典 像素头像抱枕"
}
]
*/
console.log(JSON.stringify(matchedData, 0, 4));
let dataSet2 = JKSearcher.createDataSet(data, {
//指定搜索返回的值
valueKey:'id'
});
matchedData = dataSet2.search('yunt计划', {
//搜索字段
labelKey: 'name',
//返回搜索值(指定该值后, all和highlight属性无效, 除非该值与highlightSaveKey的值相等)
valueKey: 'id',
});
//以下返回
/*
[
10091080
]
*/
console.log(JSON.stringify(matchedData, 0, 4));
```
----------
## JKSearcher
定义在window对象中, 可以通过 `window.JKSearcher` 访问该对象
### (m) createIndexes
对文本创建搜索索引, 然后可以通过搜索索引对字符串进行关键字匹配
- **原型**
**`createIndexes(str, withoutRaw) : JKSearcherIndexes`**
- **参数**
**str**: `string` 待生成所以的文本
**withoutRaw**: `boolean` 若为ture, 则生成的索引结构中不会有原始字符串, 默认`false`
- **返回值**
`JKSearcherIndexes`
返回创建好的索引结构 [JKSearcherIndexes](#-?JKSearcherIndexes)
### (m) search
返回匹配关键字的文本索引信息
- **原型**
**`search(str, word, option) : boolean|array`**
- **参数**
**str**: `string|{JKSearch-Indexes}` 原始字符串或者[createIndexes](#-?JKSearcher//(m)%20createIndexes)方法创建的索引。*参考 [JKSearcherIndexes](#-?JKSearcherIndexes)*
**word**: `string` 搜索关键字
**option**: `{JKSearcherSearchOption}` 参考 [JKSearcherSearchOption](#-?JKSearcherSearchOption)
- **返回值**
`boolean|array`
成功返回匹配结果数组, 失败返回false
> **IndexArray** 是一个`array`类型的数据, 索引说明如下
> `0`: 关键字在原始字符串中的开始坐标
> `1`: 关键字在原始字符串中的结束坐标
### (m) match
搜索文本中匹配关键字的文本内容
- **原型**
**`match(str, word, option) : array`**
- **参数**
**str**: 参考 [JKSearcher.search()](#-?JKSearcher//(m)%20search)
**word**: 参考 [JKSearcher.search()](#-?JKSearcher//(m)%20search)
**option**: 参考 [JKSearcher.search()](#-?JKSearcher//(m)%20search)
- **返回值**
`array`
返回匹配的子串
### (m) highlight
高亮匹配的文本
- **原型**
**`highlight(str, word, option) : string`**
- **参数**
**str**: 参考 [JKSearcher.search()](#-?JKSearcher//(m)%20search)
**word**: 参考 [JKSearcher.search()](#-?JKSearcher//(m)%20search)
**option**: `JKSearcherHighlightOption` 选项
- **返回值**
`string`
返回已经替换匹配项的原始字符串
### (m) createDataSet
创建一个数据集合,然后可以通过对象搜索满足关键字的对应的数据集成员列表
- **原型**
**`createDataSet(data, option) : JKSearcherDataSet`**
- **参数**
**data**: `array|object` 待搜索的数据集,可以是个数组,也可以是个对象类型
**option**: `JKSearcherDataSetOption` 创建选项, 参考[JKSearcherDataSetOption](#-?JKSearcherDataSetOption)
- **返回值**
`JKSearcherDataSet`
返回[JKSearcherDataSet](#-?JKSearcherDataSet)对象
----------
## JKSearcherIndexes
`Array` 类型, 索引数据列表, 由[JKSearcher.createIndexes](#-?JKSearcher//(m)%20createIndexes)方法返回
### (f) raw
`string` 原始字符串
### (m) search
搜索方法 - 从索引中搜索字符串
- **原型**
**`search(word, option): boolean|array`**
参考 [JKSearcher.search()](#-?JKSearcher//(m)%20search)
### (m) match
在调用[JKSearcher.createIndexes](#-?JKSearcher//(m)%20createIndexes)方法时, 如果指定第二个参数为true, 则此方法不可用
- **原型**
**`match(word, option): array`**
参考 [JKSearcher.match()](#-?JKSearcher//(m)%20match)
### (m) highlight
在调用[JKSearcher.createIndexes](#-?JKSearcher//(m)%20createIndexes)方法时, 如果指定第二个参数为true, 则此方法不可用
- **原型**
**`highlight(word, option): string`**
参考 [JKSearcher.highlight()](#-?JKSearcher//(m)%20highlight)
----------
## JKSearcherSearchOption
[JKSearcher.search](#-?JKSearcher//(m)%20search) 方法的参数选项
### (f) all
`boolean` 为true表示搜索返回所有匹配的项, 默认false
### (f) sensitive
`boolean` 大小写敏感, 为true表示区分大小写, 默认false
----------
## JKSearcherHighlightOption
继承 [JKSearcherSearchOption](#-?JKSearcherSearchOption) 对象
### (m) callback
- **原型**
`callback(str, matchItem) : string`
- **参数**
**str**: 匹配的字符串
**matchItem**: `object` 一个对象其成员如下:
value: 匹配的值
x: 匹配的开始下标
y: 匹配的结束下标
length: 匹配长度
- **返回值**
`string`
返回格式化后的字符串替换原来的字符串
----------
## JKSearcherDataSetOption
### (f) uniqueKey
`string|null` 指定数据成员的唯一值所在的key名称, 若提供此值则创建索引将以此值为依据. 如果提供此值请确保此值是唯一的. 若没有提供此值则会以数组的索引作为唯一值.
----------
## JKSearcherDataSet
### (m) reIndex
- **原型**
**`reIndex(labelKeys) : string`**
- **参数**
**labelKeys**: `string|array` 需要重建索引的key
- **返回值**
无
### (m) search
- **原型**
**`search(word, option) : object|array`**
- **参数**
**word**: `string` 搜索关键字
**option**: `JKSearcherDataSetSearchOption` 搜索选项 参考[JKSearcherDataSetSearchOption](#-?JKSearcherDataSetSearchOption)
- **返回值**
`object|array` 返回匹配的成员集合(返回值类型取决于原始数据集的类型)
### (m) updateData
- **原型**
**`updateData(data, reIndexAll) : JKSearcherDataSet`**
- **参数**
**data**: `object|array` 新的数据集合
**reIndexAll**: `boolean` 是否重新索引所有labelKey, 若设置为true, 则会清掉现有的索引, 重新建立索引. 默认false
- **返回值**
`JKSearcherDataSet` 返回原对象
### (m) getRawData
- **原型**
**`getRawData() : object|array`**
- **参数**
无
- **返回值**
`object|array`
返回原始数据集合
----------
## JKSearcherDataSetSearchOption
继承 [JKSearcherSearchOption](#-?JKSearcherSearchOption) 对象
### (f) labelKey
`string|null` 指定数据集合成员的匹配的key名称。默认为`label`
### (f) valueKey
`string|null` 指定数据集合成员的"值"所对应的key名称。 当调用搜索时会返回成员中该key中的值。若没有配置该值则默认返回数据成员
若指定了此值, 且`labelKey` 的值与 `highlightSaveKey` 不相等, 则 `highlight` 值和 `all` 无效
### (f) highlight
`boolean` 是否高亮匹配项
### (f) highlightCallback
高亮回调函数
参考 [JKSearcherHighlightOption.callback()](#-?JKSearcherHighlightOption//(m)%20callback)
### (f) highlightSaveKey
`string` 高亮后的字符串保存的key