数据对比工具之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" }// }// ]// }