|
1 | | -# diff |
2 | | -diff |
| 1 | +# diffi |
| 2 | +可配置的分支对象处理工具。分支的处理基于`tname`/`TYPE`两个内置的类型判断方法,可以基于方法名,在每个方法工具库上进行扩展。 |
| 3 | + |
| 4 | +# 安装 |
| 5 | + |
| 6 | +```bash |
| 7 | +npm i diffi |
| 8 | +``` |
| 9 | + |
| 10 | +# 内置类型判断 |
| 11 | + |
| 12 | +- `tname` 基于`Object.prototype.toString`获取对象构造类名。**此名称第一个字母是大写。** |
| 13 | +- `TYPE` 判断两个值的类型。当两个值类型一致时,返回该类型;否则返回`*`。 |
| 14 | + |
| 15 | +# 分支比较 |
| 16 | + |
| 17 | +假设有两个分支集合a、b: |
| 18 | +- 当a、b均为`Object`时,若b的`Object.keys`在a中皆具备,并且值相等,此时视b为a的子集。若字段为`Object`或`Array`,则执行深度检查。 |
| 19 | +- 当a、b均为`Array`时,若`b.lenght <= a.length`,并且b与a的值及顺序的对应关系一致,此时视b为a的子集。若元素为`Object`或`Array`,则执行深度检查。 |
| 20 | +- 其他类型情况,默认以`a === b`判断。 |
| 21 | + |
| 22 | +# 模块 |
| 23 | + |
| 24 | +## contains |
| 25 | +判断一个值是否是另一个值的子集。 |
| 26 | + |
| 27 | +```js |
| 28 | +console.log('contains', contains({ a: 1, b: 2 }, { a: 1 })) // true |
| 29 | +console.log('contains', contains({ a: 1, b: 2 }, { a: 1, b: 2 })) // true |
| 30 | +console.log('contains', contains({ a: 1, b: 2 }, { a: 1, b: 3 })) // false |
| 31 | +console.log('contains', contains({ a: 1, b: 2 }, { a: 1, b: 2, c: 3 })) // false |
| 32 | +console.log('contains', contains([1, 2], [1])) // true |
| 33 | +console.log('contains', contains([1, 2], [1, 2])) // true |
| 34 | +console.log('contains', contains([1, 2], [1, 3])) // false |
| 35 | +console.log('contains', contains([1, 2], [1, 2, 3])) // false |
| 36 | + |
| 37 | +console.log('contains', contains(1, 1)) // true |
| 38 | +console.log('contains', contains(1, 2)) // false |
| 39 | +``` |
| 40 | + |
| 41 | +## clone |
| 42 | +深度复制`Object`或`Array`对象。其他未扩展类型直接返回。 |
| 43 | + |
| 44 | +```js |
| 45 | +let a = { a: 1, b: 2 }; |
| 46 | +a.z = a; |
| 47 | +let b = { a: 1, b: 3 }; |
| 48 | +b.z = b; |
| 49 | +console.log('clone', clone(a)); |
| 50 | +// clone { a: 1, b: 2, z: [Circular] } |
| 51 | +console.log('clone', clone(b)); |
| 52 | +// clone { a: 1, b: 3, z: [Circular] } |
| 53 | +``` |
| 54 | + |
| 55 | +## diff |
| 56 | +分支比较,返回分支差异。 |
| 57 | +```js |
| 58 | +console.log('diff', diff([1,2,3], [1,3,3,7])); |
| 59 | +// diff [ <1 empty item>, 3, <1 empty item>, 7 ] |
| 60 | +console.log('diff', diff({a:1,b:2}, {a:1,b:3})); |
| 61 | +// diff { b: 3 } |
| 62 | +console.log('diff', diff({a:1,b:2, c: [1,2,3, { a: 111, b: 222 },4]}, {a:1,b:3, c: [2,2,3, { a: 111, c: 333 },4,5]})); |
| 63 | +// diff { b: 3, c: [ 2, <2 empty items>, { c: 333 }, <1 empty item>, 5 ] } |
| 64 | +``` |
| 65 | + |
| 66 | +## intersect |
| 67 | +取两个集合差集。该方法依赖`diff`对两个对象的分支差异比较结果。 |
| 68 | + |
| 69 | +```js |
| 70 | +console.log('intersect', intersect([1,2,3], [1,3,3,7])); |
| 71 | +// intersect [ 1, 3, 3, 7 ] |
| 72 | +console.log('intersect', intersect({a:1,b:2}, {a:1,b:3})); |
| 73 | +// intersect { b: 3 } |
| 74 | +console.log('intersect', intersect({a:1,b:2, c: [1,2,3, { a: 111, b: 222 },4]}, {a:1,b:3, c: [2,2,3, { a: 111, c: 333 },4,5]})); |
| 75 | +// intersect { b: 3, c: [ 2, 2, 3, { c: 333 }, 4, 5 ] } |
| 76 | +``` |
| 77 | + |
| 78 | +## assign |
| 79 | +分支深度覆盖复制。**该方法将更改第一个参数,并返回第一个参数的指针。** |
| 80 | +```js |
| 81 | +console.log('assign', assign([1,2,3], [1,3,3,7])); |
| 82 | +// assign [ 1, 3, 3, 7 ] |
| 83 | +console.log('assign', assign({a:1,b:2}, {a:1,b:3})); |
| 84 | +// assign { a: 1, b: 3 } |
| 85 | +console.log('assign', assign({a:1,b:2, c: [1,2,3, { a: 111, b: 222 },4]}, {a:1,b:3, c: [2,2,3, { a: 111, c: 333 },4,5]})); |
| 86 | +// assign { a: 1, b: 3, c: [ 2, 2, 3, { a: 111, c: 333 }, 4, 5 ] } |
| 87 | +``` |
| 88 | + |
| 89 | +# 扩展 |
| 90 | +在每个模块中,都有对应的类型方法集。通过扩展这个集合,可让每个模块对更多类型的对象进行处理。 |
| 91 | +```js |
| 92 | +containsExpand('String', (a, b) => a.indexOf(b) > -1) // 扩展类型处理方法 |
| 93 | +console.log('contains', contains('abcde', 'bcd')) // true |
| 94 | +``` |
| 95 | + |
| 96 | +模块扩展方法: |
| 97 | +- containsExpand |
| 98 | +- cloneExpand |
| 99 | +- diffExpand |
| 100 | +- intersectExpand |
| 101 | +- assignExpand |
0 commit comments