数据对比工具之diff
江湖 JS 在数据同步方面,提供了基础的列表 diff 的工具,可以快速算出两个列表的对比情况,包括新增、删除、修改了哪些元素
使用方式
引入 diff
const diff = require('@jianghujs/jianghu/app/common/diffUtil');
使用
const res = diff(oldList, newList, primaryKey);
// 或
const res = diff(oldList, newList); // primaryKey = 'id'
参数说明
oldList
要对比的旧数据列表newList
要对比的新数据列表primaryKey
对比时使用的主键 key,默认不填为 'id',当填写之后,对比过程会忽略数据中的 id 字段,以 primaryKey 字段为准,对比非 id 的其它字段
使用场景1: 对比时以 id 做主键 key
在表与表进行全量对比时,可以使用 id 做主键 key。
const res = diff(
[
{ id: 1, name: 'a' },
{ id: 2, name: 'b' },
{ id: 3, name: 'c' },
{ id: 4, name: 'd' },
{ id: 5, name: 'e' },
],
[
{ id: 1, name: 'a' },
{ id: 2, name: 'x' },
{ id: 7, name: 'e' },
]
);
// 输出
// {
// "added": [
// { "id": 7, "name": "e" }
// ],
// "removed": [
// { "id": 3, "name": "c" },
// { "id": 4, "name": "d" },
// { "id": 5, "name": "e" }
// ],
// "changed": [
// {
// "old": { "id": 2, "name": "b" },
// "new": { "id": 2, "name": "x" }
// }
// ]
// }
使用场景2:对比时指定主键 key
当对比的数据源为视图和表时,由于视图的数据可能没有 id,只有业务主键,则需要指定主键 key,以指定字段做对比。
const res = diff(
[
{ id: 1, dataId: 'I', name: 'a' },
{ id: 2, dataId: 'II', name: 'b' },
{ id: 3, dataId: 'III', name: 'c' },
{ id: 4, dataId: 'IV', name: 'd' },
{ id: 5, dataId: 'V', name: 'e' },
],
[ // 来自 view,没有主键
{ dataId: 'I', name: 'a' },
{ dataId: 'II', name: 'x' },
{ dataId: 'VII', name: 'e' },
],
'dataId'
);
// 输出
// {
// "added": [
// { "dataId": "VII", "name": "e" }
// ],
// "removed": [
// { "id": 3, "dataId": "III", "name": "c" },
// { "id": 4, "dataId": "IV", "name": "d" },
// { "id": 5, "dataId": "V", "name": "e" }
// ],
// "changed": [
// {
// "old": { "id": 2, "dataId": "II", "name": "b" },
// "new": { "dataId": "II", "name": "x" }
// }
// ]
// }