looseEqual.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. /* istanbul ignore if: this if will probably never be called */
  31. if (!aValidType || !bValidType) {
  32. return false
  33. }
  34. const aKeysCount = Object.keys(a).length
  35. const bKeysCount = Object.keys(b).length
  36. if (aKeysCount !== bKeysCount) {
  37. return false
  38. }
  39. for (const key in a) {
  40. const aHasKey = a.hasOwnProperty(key)
  41. const bHasKey = b.hasOwnProperty(key)
  42. if (
  43. (aHasKey && !bHasKey) ||
  44. (!aHasKey && bHasKey) ||
  45. !looseEqual(a[key], b[key])
  46. ) {
  47. return false
  48. }
  49. }
  50. }
  51. return String(a) === String(b)
  52. }
  53. export function looseIndexOf(arr: any[], val: any): number {
  54. return arr.findIndex(item => looseEqual(item, val))
  55. }