looseEqual【比较对象内部结构和数据】🔥🔥🔥
描述
判断两个值是否相等,包含对象,数组,以及原始值的判断, 只比较内部结构和数据 v3.0.4+
# 1.示例
import { looseEqual } from 'sf-utils2'
const a = { name: 'v2324' }
const b = { name: 'v2324' }
looseEqual(a, b) // true
const c = { name: 'v2324', id: 1 }
looseEqual(a, c) // false
const d = { name: 'v2324', ids: [1, 2, 4] }
looseEqual(a, d) // false
const e = { name: 'v2324', ids: [1, 2, 4] }
looseEqual(e, d) // true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
:::
# 2.入参说明
| 参数 | 说明 | 类型 | 是否必填 | 默认值 |
|---|---|---|---|---|
| a | 对象一 | Object | 是 | |
| b | 对象二 | Object | 是 |
# 3.源码
import isObject from '@/base/isObject'
/**
* 判断两个值是否相等,包含对象,数组,以及原始值的判断, 只比较内部结构和数据
* @param {any} a
* @param {any} b
* @return {false|this is string[]|boolean|*}
*/
function looseEqual(a, b) {
if (a === b) return true
const isObjectA = isObject(a)
const isObjectB = isObject(b)
if (isObjectA && isObjectB) {
try {
const isArrayA = Array.isArray(a)
const isArrayB = Array.isArray(b)
if (isArrayA && isArrayB) {
return (
a.length === b.length &&
a.every((e, i) => {
return looseEqual(e, b[i])
})
)
} else if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime()
} else if (!isArrayA && !isArrayB) {
const keysA = Object.keys(a)
const keysB = Object.keys(b)
return (
keysA.length === keysB.length &&
keysA.every(key => {
return looseEqual(a[key], b[key])
})
)
} else {
/* istanbul ignore next */
return false
}
} catch (e) {
/* istanbul ignore next */
return false
}
} else if (!isObjectA && !isObjectB) {
return String(a) === String(b)
} else {
return false
}
}
export default looseEqual
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
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
上次更新: 2024/01/08, 21:47:25