# data-mapping
**Repository Path**: dream2023/data-mapping
## Basic Information
- **Project Name**: data-mapping
- **Description**: @dream2023/data-mapping is a perfect object mapping solution。
- **Primary Language**: TypeScript
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2021-02-19
- **Last Updated**: 2022-07-11
## Categories & Tags
**Categories**: javascript-toolkits
**Tags**: None
## README
@dream2023/data-mapping




## 介绍
`@dream2023/data-mapping` 通过抽离并融合 `vue 2` 中的表达式解析能力,以及自身的数据映射能力,形成了小巧而功能完善的表达式和对象解析引擎。
## 特点
- 体积小:源码 3Kb + 依赖 4Kb = 7Kb;
- 能力强:支持深度对象、自定义分隔符、自定义过滤器等;
- 稳定性高:测试覆盖率 100%。
## 快速上手
```bash
yarn add @dream2023/data-mapping # npm install -S @dream2023/data-mapping
```
```js
import { compilerStr, dataMapping } from '@dream2023/data-mapping';
compilerStr('{{name}}', { name: 'jack' }); // "jack"
dataMapping(
{ username: '{{ info.name }}', address: '{{ address }}' },
{ info: { name: '夏洛克福尔摩斯' }, address: '伦敦贝克街221号' }
); // { username: '夏洛克福尔摩斯', address: '伦敦贝克街221号' }
```
## 功能详解
### 模板字符串
```js
compilerStr('{{name}}', { name: 'jack' }); // "jack"
```
`compilerStr` 接受两个参数,第一个参数为需要编译的字符串模板,第二个参数为数据对象,字符串模板会根据数据对象编译出相应的结果。
```js
compilerStr('{{firstName}} -- {{lastName}}', {
firstName: 'jack',
lastName: 'li'
}); // "jack --- li"
```
它不仅可以作为单个变量的取值,还可以是多个变量组成的字符串。
### 表达式
```js
compilerStr("{{ok ? 'YES' : 'NO'}}", { ok: true }); // "YES"
compilerStr("{{message.split('').reverse().join('')}}", {
message: 'are you ok?'
}); // "?ko uoy era"
```
不仅可以取值,内部还可以使用表达式。
### 支持链式取值
```js
compilerStr(
'My name is {{name}}. I live in {{address.area}}, {{address.city}}',
{
name: 'jack',
address: {
city: 'Shenzhen',
area: 'Nanshan'
}
}
);
```
### 对象数据映射
`@dream2023/data-mapping` 不仅提供了对字符串的编译,还提供了对对象的编译。
```js
dataMapping(
{ username: '{{name}}', password: '{{pwd}}' },
{ name: 'jack', pwd: 'helloworld' }
); // { username: 'jack', password: 'helloworld' }
```
当然,其也是支持深度嵌套,以及上述 `compilerStr` 所有特性。
```js
// 支持函数
dataMapping(
{
country(data: any) {
return data.address.split('-')[0];
},
province(data: any) {
return data.address.split('-')[1];
}
},
{ address: 'china-guangzhou' }
); // { country: 'china', province: 'guangzhou' }
```
### 过滤器
过滤器是对数据映射的一种增强,它的作用是对获取数据做一些处理,其用法同 vue2 中的[过滤器](https://cn.vuejs.org/v2/guide/filters.html):
```
{{ message | filterA | filterB }}
```
#### 自定义过滤器
```js
import { setFilter, setFilters, clearFilters } from '@dream2023/data-mapping';
// 实现一个函数
const capitalize = (value) => {
if (!value) return '';
value = value.toString();
return value.charAt(0).toUpperCase() + value.slice(1);
};
// 设置单个过滤器
setFilter('capitalize', capitalize);
// 设置多个过滤器
setFilters({ capitalize });
// 使用
compilerStr('{{ message | capitalize }}', { message: 'hello' }); // Hello
// 如果不想用过滤器,也可以清除
clearFilters();
```
### 分隔符
如果你觉得默认的分隔符不符合你的习惯,可以更改分隔符,具体如下:
```js
import {
compilerStr,
setDelimiters,
clearDelimiters
} from '@dream2023/data-mapping';
// 设置分隔符
setDelimiters(['${', '}']);
// 使用
compilerStr('My Name is ${name}', { name: 'Jack' });
// 当然,设置后也可以清除
clearDelimiters();
```
因为是全局设置,会影响上述 DEMO,所以这里就不做演示了。
### $ 符便捷展开对象
我们首先看下面示例,我们需要将 `longitude` 和 `latitude` 从 `loc` 字段中抽离到上一层级,我们就需要下面这样写 👇:
```js
dataMapping(
{
name: '{{name}}',
longitude: '{{loc.longitude}}',
latitude: '{{loc.latitude}}'
},
{
name: 'jack',
loc: { longitude: 118.366899, latitude: 40.90281 }
}
); // { name: 'jack', longitude: 118.366899, latitude: 40.90281 }
```
其实两个字段还好,如果属性非常多的时候就比较麻烦,此时我们可以通过 `$` 便捷的实现展开:
```js
dataMapping(
{
name: '{{name}}',
$: '{{loc}}'
},
{
name: 'jack',
loc: { longitude: 118.366899, latitude: 40.90281 }
}
); // { name: 'jack', longitude: 118.366899, latitude: 40.90281 }
```
## 相关链接
- [vue filters](https://cn.vuejs.org/v2/guide/filters.html)