1- import { isArray , isDate , isObject , isSymbol } from './general'
1+ import { isArray , isDate , isMap , isObject , isSet , isSymbol } from './general'
22
33function looseCompareArrays ( a : any [ ] , b : any [ ] ) {
44 if ( a . length !== b . length ) return false
@@ -9,6 +9,27 @@ function looseCompareArrays(a: any[], b: any[]) {
99 return equal
1010}
1111
12+ function looseCompareCollections (
13+ a : Map < any , any > | Set < any > ,
14+ b : Map < any , any > | Set < any > ,
15+ ) {
16+ if ( a . size !== b . size ) return false
17+ const candidates = Array . from ( b )
18+ const matched = new Uint8Array ( candidates . length )
19+ for ( const item of a ) {
20+ let index = - 1
21+ for ( let i = 0 ; i < candidates . length ; i ++ ) {
22+ if ( ! matched [ i ] && looseEqual ( item , candidates [ i ] ) ) {
23+ index = i
24+ break
25+ }
26+ }
27+ if ( index < 0 ) return false
28+ matched [ index ] = 1
29+ }
30+ return true
31+ }
32+
1233export function looseEqual ( a : any , b : any ) : boolean {
1334 if ( a === b ) return true
1435 let aValidType = isDate ( a )
@@ -32,6 +53,16 @@ export function looseEqual(a: any, b: any): boolean {
3253 if ( ! aValidType || ! bValidType ) {
3354 return false
3455 }
56+ aValidType = isMap ( a )
57+ bValidType = isMap ( b )
58+ if ( aValidType || bValidType ) {
59+ return aValidType && bValidType ? looseCompareCollections ( a , b ) : false
60+ }
61+ aValidType = isSet ( a )
62+ bValidType = isSet ( b )
63+ if ( aValidType || bValidType ) {
64+ return aValidType && bValidType ? looseCompareCollections ( a , b ) : false
65+ }
3566 const aKeysCount = Object . keys ( a ) . length
3667 const bKeysCount = Object . keys ( b ) . length
3768 if ( aKeysCount !== bKeysCount ) {
0 commit comments