抽象一个严格相等库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { type } from '@jslib-book/type'

function equalArray(value, other, enhancer) {
// 如果两个数组的长度不相等 那么直接返回false
if (value.length !== other.length) {
return false
}

// 遍历数组的每一项,进行比较,如果不相等返回false
for (let i = 0; i < value.length; i++) {
if (!isEqual(value[i], other[i], enhancer)) {
return false
}
}

// 默认返回true
return true
}

function equalObject(value, other, enhancer) {
// 拿到两个对象的Keys
const vKeys = Object.keys(value)
const oKeys = Object.keys(other)

// 如果两者keys数组的长度不一样 也没有比较的必要了
if (vKeys.length !== oKeys.length) {
return false
}

// 循环遍历两个对象的值
for (let i = 0; i < vKeys.length; i++) {
const v = value(vKeys[i])
const o = other[oKeys[i]]
// 如果两个对象的值不相等,那么返回false
if (!isEqual(v, o, enhancer)) {
return false
}
}

// 默认返回true
return true
}

export function isEqual(value, other, enhancer) {
const next = () => {
// 如果相等,返回true
if (value === other) {
return true
}

// 拿到两个参数的type值
const vType = type(value)
const oType = type(other)

// 类型不同
if (vType !== oType) {
return false
}

// 如果是数组类型就按照数组判断的逻辑往下进行
if (vType === 'array') {
return equalArray(value, other, enhancer)
}
// 如果是对象类型就按照对象判断的逻辑往下进行
if (vType === 'object') {
return equalObject(value, other, enhancer)
}
// 比较两者是否相等并返回结果
return value === other
}

if (type(enhancer) === 'function') {
return enhancer(next)(value, other)
}

return next()

}