| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- import { isArray, isDate, isObject, isSymbol } from './general'
- function looseCompareArrays(a: any[], b: any[]) {
- if (a.length !== b.length) return false
- let equal = true
- for (let i = 0; equal && i < a.length; i++) {
- equal = looseEqual(a[i], b[i])
- }
- return equal
- }
- export function looseEqual(a: any, b: any): boolean {
- if (a === b) return true
- let aValidType = isDate(a)
- let bValidType = isDate(b)
- if (aValidType || bValidType) {
- return aValidType && bValidType ? a.getTime() === b.getTime() : false
- }
- aValidType = isSymbol(a)
- bValidType = isSymbol(b)
- if (aValidType || bValidType) {
- return a === b
- }
- aValidType = isArray(a)
- bValidType = isArray(b)
- if (aValidType || bValidType) {
- return aValidType && bValidType ? looseCompareArrays(a, b) : false
- }
- aValidType = isObject(a)
- bValidType = isObject(b)
- if (aValidType || bValidType) {
- if (!aValidType || !bValidType) {
- return false
- }
- const aKeysCount = Object.keys(a).length
- const bKeysCount = Object.keys(b).length
- if (aKeysCount !== bKeysCount) {
- return false
- }
- for (const key in a) {
- const aHasKey = a.hasOwnProperty(key)
- const bHasKey = b.hasOwnProperty(key)
- if (
- (aHasKey && !bHasKey) ||
- (!aHasKey && bHasKey) ||
- !looseEqual(a[key], b[key])
- ) {
- return false
- }
- }
- }
- return String(a) === String(b)
- }
- export function looseIndexOf(arr: any[], val: any): number {
- return arr.findIndex(item => looseEqual(item, val))
- }
|