looseEqual.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { isArray, isDate, isObject, isSymbol } from './general'
  2. function looseCompareArrays(a: any[], b: any[]) {
  3. if (a.length !== b.length) return false
  4. let equal = true
  5. for (let i = 0; equal && i < a.length; i++) {
  6. equal = looseEqual(a[i], b[i])
  7. }
  8. return equal
  9. }
  10. export function looseEqual(a: any, b: any): boolean {
  11. if (a === b) return true
  12. let aValidType = isDate(a)
  13. let bValidType = isDate(b)
  14. if (aValidType || bValidType) {
  15. return aValidType && bValidType ? a.getTime() === b.getTime() : false
  16. }
  17. aValidType = isSymbol(a)
  18. bValidType = isSymbol(b)
  19. if (aValidType || bValidType) {
  20. return a === b
  21. }
  22. aValidType = isArray(a)
  23. bValidType = isArray(b)
  24. if (aValidType || bValidType) {
  25. return aValidType && bValidType ? looseCompareArrays(a, b) : false
  26. }
  27. aValidType = isObject(a)
  28. bValidType = isObject(b)
  29. if (aValidType || bValidType) {
  30. if (!aValidType || !bValidType) {
  31. return false
  32. }
  33. const aKeysCount = Object.keys(a).length
  34. const bKeysCount = Object.keys(b).length
  35. if (aKeysCount !== bKeysCount) {
  36. return false
  37. }
  38. for (const key in a) {
  39. const aHasKey = a.hasOwnProperty(key)
  40. const bHasKey = b.hasOwnProperty(key)
  41. if (
  42. (aHasKey && !bHasKey) ||
  43. (!aHasKey && bHasKey) ||
  44. !looseEqual(a[key], b[key])
  45. ) {
  46. return false
  47. }
  48. }
  49. }
  50. return String(a) === String(b)
  51. }
  52. export function looseIndexOf(arr: any[], val: any): number {
  53. return arr.findIndex(item => looseEqual(item, val))
  54. }