looseEqual.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { isArray, isDate, isObject } from './'
  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 = isArray(a)
  18. bValidType = isArray(b)
  19. if (aValidType || bValidType) {
  20. return aValidType && bValidType ? looseCompareArrays(a, b) : false
  21. }
  22. aValidType = isObject(a)
  23. bValidType = isObject(b)
  24. if (aValidType || bValidType) {
  25. /* istanbul ignore if: this if will probably never be called */
  26. if (!aValidType || !bValidType) {
  27. return false
  28. }
  29. const aKeysCount = Object.keys(a).length
  30. const bKeysCount = Object.keys(b).length
  31. if (aKeysCount !== bKeysCount) {
  32. return false
  33. }
  34. for (const key in a) {
  35. const aHasKey = a.hasOwnProperty(key)
  36. const bHasKey = b.hasOwnProperty(key)
  37. if (
  38. (aHasKey && !bHasKey) ||
  39. (!aHasKey && bHasKey) ||
  40. !looseEqual(a[key], b[key])
  41. ) {
  42. return false
  43. }
  44. }
  45. }
  46. return String(a) === String(b)
  47. }
  48. export function looseIndexOf(arr: any[], val: any): number {
  49. return arr.findIndex(item => looseEqual(item, val))
  50. }