From: skirtle <65301168+skirtles-code@users.noreply.github.com> Date: Mon, 29 Apr 2024 06:29:55 +0000 (+0100) Subject: refactor: simplify traverse() for deep watchers (#10795) X-Git-Tag: v3.4.26~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2d56816aa8f071aed954d4042f40ae0afdfe7a16;p=thirdparty%2Fvuejs%2Fcore.git refactor: simplify traverse() for deep watchers (#10795) --- diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index bc10547824..0fd6b050cf 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -466,39 +466,32 @@ export function createPathGetter(ctx: any, path: string) { export function traverse( value: unknown, - depth?: number, - currentDepth = 0, + depth = Infinity, seen?: Set, ) { - if (!isObject(value) || (value as any)[ReactiveFlags.SKIP]) { + if (depth <= 0 || !isObject(value) || (value as any)[ReactiveFlags.SKIP]) { return value } - if (depth && depth > 0) { - if (currentDepth >= depth) { - return value - } - currentDepth++ - } - seen = seen || new Set() if (seen.has(value)) { return value } seen.add(value) + depth-- if (isRef(value)) { - traverse(value.value, depth, currentDepth, seen) + traverse(value.value, depth, seen) } else if (isArray(value)) { for (let i = 0; i < value.length; i++) { - traverse(value[i], depth, currentDepth, seen) + traverse(value[i], depth, seen) } } else if (isSet(value) || isMap(value)) { value.forEach((v: any) => { - traverse(v, depth, currentDepth, seen) + traverse(v, depth, seen) }) } else if (isPlainObject(value)) { for (const key in value) { - traverse(value[key], depth, currentDepth, seen) + traverse(value[key], depth, seen) } } return value