在JavaScript中,递归是一种常用的编程技巧,特别是在处理嵌套数据结构时。递归匹配数据通常指的是使用递归函数来遍历和处理嵌套的数据结构,如数组或对象,以便查找符合特定条件的数据。
递归函数是指在函数内部调用自身的函数。递归函数通常有两个主要部分:
假设我们有一个嵌套的数据结构,我们想要找到所有的数字类型字段,并计算它们的总和:
const data = {
a: 1,
b: {
b1: 2,
b2: {
b21: 3,
b22: 'hello'
}
},
c: [4, { c1: 5 }]
};
function sumNumbers(obj) {
let sum = 0;
function recurse(current) {
if (typeof current === 'number') {
sum += current;
} else if (Array.isArray(current)) {
current.forEach(item => recurse(item));
} else if (typeof current === 'object' && current !== null) {
Object.values(current).forEach(value => recurse(value));
}
}
recurse(obj);
return sum;
}
console.log(sumNumbers(data)); // 输出应该是 1+2+3+4+5 = 15
function sumNumbersSafe(obj, visited = new WeakSet()) {
let sum = 0;
if (visited.has(obj)) {
return sum;
}
visited.add(obj);
function recurse(current) {
if (typeof current === 'number') {
sum += current;
} else if (Array.isArray(current)) {
current.forEach(item => recurse(item));
} else if (typeof current === 'object' && current !== null) {
Object.values(current).forEach(value => recurse(value));
}
}
recurse(obj);
return sum;
}
// 假设data中存在循环引用
data.b.b2.self = data.b;
console.log(sumNumbersSafe(data)); // 输出应该是 15,即使存在循环引用
在这个例子中,我们使用了WeakSet
来跟踪已经访问过的对象,从而避免了循环引用导致的无限递归问题。
领取专属 10元无门槛券
手把手带您无忧上云