@@ -3,7 +3,12 @@ import { settings } from "./settings";
3
3
export interface HashTable < T = any > {
4
4
[ key : string ] : T ;
5
5
}
6
-
6
+ export interface IEqualValuesParameters {
7
+ ignoreOrder ?: boolean ;
8
+ caseSensitive ?: boolean ;
9
+ trimStrings ?: boolean ;
10
+ doNotConvertNumbers ?: boolean ;
11
+ }
7
12
export function createDate ( reason : string , val ?: number | string | Date ) : Date {
8
13
if ( ! val ) return new Date ( ) ;
9
14
if ( ! settings . storeUtcDates && typeof val === "string" && isISODateOnly ( val ) ) {
@@ -49,15 +54,10 @@ export class Helpers {
49
54
}
50
55
return true ;
51
56
}
52
- public static isArraysEqual (
53
- x : any ,
54
- y : any ,
55
- ignoreOrder : boolean = false ,
56
- caseSensitive ?: boolean ,
57
- trimStrings ? : boolean
58
- ) : boolean {
57
+ public static checkIfArraysEqual ( x : any , y : any , params : IEqualValuesParameters ) : boolean {
59
58
if ( ! Array . isArray ( x ) || ! Array . isArray ( y ) ) return false ;
60
59
if ( x . length !== y . length ) return false ;
60
+ const ignoreOrder : boolean = params . ignoreOrder !== undefined ? params . ignoreOrder : false ;
61
61
if ( ignoreOrder ) {
62
62
var xSorted = [ ] ;
63
63
var ySorted = [ ] ;
@@ -71,10 +71,19 @@ export class Helpers {
71
71
y = ySorted ;
72
72
}
73
73
for ( var i = 0 ; i < x . length ; i ++ ) {
74
- if ( ! Helpers . isTwoValueEquals ( x [ i ] , y [ i ] , ignoreOrder , caseSensitive , trimStrings ) ) return false ;
74
+ if ( ! Helpers . checkIfValuesEqual ( x [ i ] , y [ i ] , params ) ) return false ;
75
75
}
76
76
return true ;
77
77
}
78
+ public static isArraysEqual (
79
+ x : any ,
80
+ y : any ,
81
+ ignoreOrder : boolean = false ,
82
+ caseSensitive ?: boolean ,
83
+ trimStrings ? : boolean
84
+ ) : boolean {
85
+ return Helpers . checkIfArraysEqual ( x , y , { ignoreOrder : ignoreOrder , caseSensitive : caseSensitive , trimStrings : trimStrings } ) ;
86
+ }
78
87
public static compareStrings ( x : string , y : string ) : number {
79
88
const normalize = settings . comparator . normalizeTextCallback ;
80
89
if ( ! ! x ) x = normalize ( x , "compare" ) . trim ( ) ;
@@ -100,13 +109,7 @@ export class Helpers {
100
109
}
101
110
return x > y ? 1 : - 1 ;
102
111
}
103
- public static isTwoValueEquals (
104
- x : any ,
105
- y : any ,
106
- ignoreOrder : boolean = false ,
107
- caseSensitive ?: boolean ,
108
- trimStrings ? : boolean
109
- ) : boolean {
112
+ public static checkIfValuesEqual ( x : any , y : any , params : IEqualValuesParameters ) : boolean {
110
113
if ( x === y ) return true ;
111
114
112
115
if ( Array . isArray ( x ) && x . length === 0 && typeof y === "undefined" )
@@ -115,8 +118,8 @@ export class Helpers {
115
118
return true ;
116
119
if ( ( x === undefined || x === null ) && y === "" ) return true ;
117
120
if ( ( y === undefined || y === null ) && x === "" ) return true ;
118
- if ( trimStrings = == undefined ) trimStrings = settings . comparator . trimStrings ;
119
- if ( caseSensitive = == undefined ) caseSensitive = settings . comparator . caseSensitive ;
121
+ const caseSensitive = params . caseSensitive ! == undefined ? params . caseSensitive : settings . comparator . caseSensitive ;
122
+ const trimStrings = params . trimStrings ! == undefined ? params . trimStrings : settings . comparator . trimStrings ;
120
123
121
124
if ( typeof x === "string" && typeof y === "string" ) {
122
125
const normalize = settings . comparator . normalizeTextCallback ;
@@ -133,8 +136,8 @@ export class Helpers {
133
136
return x === y ;
134
137
}
135
138
if ( x instanceof Date && y instanceof Date ) return x . getTime ( ) == y . getTime ( ) ;
136
-
137
- if ( Helpers . isConvertibleToNumber ( x ) && Helpers . isConvertibleToNumber ( y ) ) {
139
+ const convertNumbers = ! params . doNotConvertNumbers ;
140
+ if ( convertNumbers && Helpers . isConvertibleToNumber ( x ) && Helpers . isConvertibleToNumber ( y ) ) {
138
141
if ( parseInt ( x ) === parseInt ( y ) && parseFloat ( x ) === parseFloat ( y ) ) {
139
142
return true ;
140
143
}
@@ -151,23 +154,34 @@ export class Helpers {
151
154
if ( ( y === true || y === false ) && typeof x == "string" ) {
152
155
return y . toString ( ) === x . toLocaleLowerCase ( ) ;
153
156
}
154
- if ( ! Helpers . isValueObject ( x ) && ! Helpers . isValueObject ( y ) ) return x == y ;
155
- if ( ! Helpers . isValueObject ( x ) || ! Helpers . isValueObject ( y ) ) return false ;
157
+ const isXObj = Helpers . isValueObject ( x ) ;
158
+ const isYObj = Helpers . isValueObject ( y ) ;
159
+ if ( ! isXObj && ! isYObj && ( convertNumbers || ( typeof x !== "number" && typeof y !== "number" ) ) ) return x == y ;
160
+ if ( ! isXObj || ! isYObj ) return false ;
156
161
if ( x [ "equals" ] && y [ "equals" ] ) return x . equals ( y ) ;
157
162
if ( Array . isArray ( x ) && Array . isArray ( y ) ) {
158
- return Helpers . isArraysEqual ( x , y , ignoreOrder , caseSensitive , trimStrings ) ;
163
+ return Helpers . checkIfArraysEqual ( x , y , params ) ;
159
164
}
160
165
161
166
for ( var p in x ) {
162
167
if ( ! x . hasOwnProperty ( p ) ) continue ;
163
168
if ( ! y . hasOwnProperty ( p ) ) return false ;
164
- if ( ! this . isTwoValueEquals ( x [ p ] , y [ p ] , ignoreOrder , caseSensitive , trimStrings ) ) return false ;
169
+ if ( ! this . checkIfValuesEqual ( x [ p ] , y [ p ] , params ) ) return false ;
165
170
}
166
171
for ( p in y ) {
167
172
if ( y . hasOwnProperty ( p ) && ! x . hasOwnProperty ( p ) ) return false ;
168
173
}
169
174
return true ;
170
175
}
176
+ public static isTwoValueEquals (
177
+ x : any ,
178
+ y : any ,
179
+ ignoreOrder : boolean = false ,
180
+ caseSensitive ?: boolean ,
181
+ trimStrings ? : boolean
182
+ ) : boolean {
183
+ return this . checkIfValuesEqual ( x , y , { ignoreOrder : ignoreOrder , caseSensitive : caseSensitive , trimStrings : trimStrings } ) ;
184
+ }
171
185
public static randomizeArray < T > ( array : Array < T > ) : Array < T > {
172
186
for ( var i = array . length - 1 ; i > 0 ; i -- ) {
173
187
var j = Math . floor ( Math . random ( ) * ( i + 1 ) ) ;
0 commit comments