Skip to content

Instantly share code, notes, and snippets.

@marsgpl
Last active December 6, 2023 17:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marsgpl/013d56c2a6b713e791b88e2962c29d25 to your computer and use it in GitHub Desktop.
Save marsgpl/013d56c2a6b713e791b88e2962c29d25 to your computer and use it in GitHub Desktop.
deepEquals.ts
function deepEquals(v1: unknown, v2: unknown): boolean {
if (v1 === v2) { return true } // equals
const t1 = typeof v1
const t2 = typeof v2
if (t1 !== t2) { return false } // diff types
if (t1 !== 'object') { return false }
// objects or arrays
const isArr1 = Array.isArray(v1)
const isArr2 = Array.isArray(v2)
if (isArr1 && isArr2) { // arrays
if (v1.length !== v2.length) { return false }
for (let i = 0; i < v1.length; ++i) {
if (!deepEquals(v1[i], v2[i])) { return false }
}
return true
} else if (isArr1 || isArr2) { // one is array, other is not
return false
} else { // objects
if (Object.keys(v1 as O).length !== Object.keys(v2 as O).length) { return false }
for (const k in v1 as O) {
if (!deepEquals((v1 as O)[k], (v2 as O)[k])) { return false }
}
return true
}
}
type O = Record<string, unknown>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment