数据对比工具之diff

江湖 JS 在数据同步方面,提供了基础的列表 diff 的工具,可以快速算出两个列表的对比情况,包括新增、删除、修改了哪些元素

使用方式

引入 diff

  1. const diff = require('@jianghujs/jianghu/app/common/diffUtil');

使用

  1. const res = diff(oldList, newList, primaryKey);
  2. // 或
  3. const res = diff(oldList, newList); // primaryKey = 'id'

参数说明

  • oldList 要对比的旧数据列表
  • newList 要对比的新数据列表
  • primaryKey 对比时使用的主键 key,默认不填为 'id',当填写之后,对比过程会忽略数据中的 id 字段,以 primaryKey 字段为准,对比非 id 的其它字段

使用场景1: 对比时以 id 做主键 key

在表与表进行全量对比时,可以使用 id 做主键 key。

  1. const res = diff(
  2. [
  3. { id: 1, name: 'a' },
  4. { id: 2, name: 'b' },
  5. { id: 3, name: 'c' },
  6. { id: 4, name: 'd' },
  7. { id: 5, name: 'e' },
  8. ],
  9. [
  10. { id: 1, name: 'a' },
  11. { id: 2, name: 'x' },
  12. { id: 7, name: 'e' },
  13. ]
  14. );
  15. // 输出
  16. // {
  17. // "added": [
  18. // { "id": 7, "name": "e" }
  19. // ],
  20. // "removed": [
  21. // { "id": 3, "name": "c" },
  22. // { "id": 4, "name": "d" },
  23. // { "id": 5, "name": "e" }
  24. // ],
  25. // "changed": [
  26. // {
  27. // "old": { "id": 2, "name": "b" },
  28. // "new": { "id": 2, "name": "x" }
  29. // }
  30. // ]
  31. // }

使用场景2:对比时指定主键 key

当对比的数据源为视图和表时,由于视图的数据可能没有 id,只有业务主键,则需要指定主键 key,以指定字段做对比。

  1. const res = diff(
  2. [
  3. { id: 1, dataId: 'I', name: 'a' },
  4. { id: 2, dataId: 'II', name: 'b' },
  5. { id: 3, dataId: 'III', name: 'c' },
  6. { id: 4, dataId: 'IV', name: 'd' },
  7. { id: 5, dataId: 'V', name: 'e' },
  8. ],
  9. [ // 来自 view,没有主键
  10. { dataId: 'I', name: 'a' },
  11. { dataId: 'II', name: 'x' },
  12. { dataId: 'VII', name: 'e' },
  13. ],
  14. 'dataId'
  15. );
  16. // 输出
  17. // {
  18. // "added": [
  19. // { "dataId": "VII", "name": "e" }
  20. // ],
  21. // "removed": [
  22. // { "id": 3, "dataId": "III", "name": "c" },
  23. // { "id": 4, "dataId": "IV", "name": "d" },
  24. // { "id": 5, "dataId": "V", "name": "e" }
  25. // ],
  26. // "changed": [
  27. // {
  28. // "old": { "id": 2, "dataId": "II", "name": "b" },
  29. // "new": { "dataId": "II", "name": "x" }
  30. // }
  31. // ]
  32. // }