export function traverse(
value: unknown,
- depth?: number,
- currentDepth = 0,
+ depth = Infinity,
seen?: Set<unknown>,
) {
- 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