43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
import { isObject, isArray } from './'
|
|
|
|
export function looseEqual(a: any, b: any): boolean {
|
|
if (a === b) return true
|
|
const isObjectA = isObject(a)
|
|
const isObjectB = isObject(b)
|
|
if (isObjectA && isObjectB) {
|
|
try {
|
|
const isArrayA = isArray(a)
|
|
const isArrayB = isArray(b)
|
|
if (isArrayA && isArrayB) {
|
|
return (
|
|
a.length === b.length &&
|
|
a.every((e: any, i: any) => 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 => 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 function looseIndexOf(arr: any[], val: any): number {
|
|
return arr.findIndex(item => looseEqual(item, val))
|
|
}
|