From 2d56816aa8f071aed954d4042f40ae0afdfe7a16 Mon Sep 17 00:00:00 2001 From: skirtle <65301168+skirtles-code@users.noreply.github.com> Date: Mon, 29 Apr 2024 07:29:55 +0100 Subject: [PATCH] refactor: simplify traverse() for deep watchers (#10795) --- packages/runtime-core/src/apiWatch.ts | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index bc1054782..0fd6b050c 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