嵌套数据结构是指数据结构内部包含其他数据结构的情况,常见于树形结构、图结构等。例如,一个对象内部可能包含另一个对象,或者一个数组内部可能包含其他数组或对象。
常见的嵌套数据结构包括:
嵌套数据结构广泛应用于各种领域,如:
以下是一个使用递归方法打印嵌套对象的示例代码:
function printNestedObject(obj, indent = 0) {
const indentStr = ' '.repeat(indent * 2);
for (const key in obj) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
console.log(`${indentStr}${key}:`);
printNestedObject(obj[key], indent + 1);
} else {
console.log(`${indentStr}${key}: ${obj[key]}`);
}
}
}
const nestedData = {
name: 'John',
age: 30,
address: {
street: '123 Main St',
city: 'Anytown',
zip: '12345',
coordinates: {
lat: 40.7128,
lng: -74.0060
}
},
hobbies: ['reading', 'traveling']
};
printNestedObject(nestedData);
原因:当数据结构中存在循环引用时,递归函数会无限调用自身,导致栈溢出。
解决方法:在递归函数中添加一个集合来记录已经访问过的对象,避免重复访问。
function printNestedObject(obj, indent = 0, visited = new Set()) {
const indentStr = ' '.repeat(indent * 2);
if (visited.has(obj)) {
console.log(`${indentStr}<Circular Reference>`);
return;
}
visited.add(obj);
for (const key in obj) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
console.log(`${indentStr}${key}:`);
printNestedObject(obj[key], indent + 1, visited);
} else {
console.log(`${indentStr}${key}: ${obj[key]}`);
}
}
visited.delete(obj);
}
通过这种方式,可以有效避免无限递归的问题。
领取专属 10元无门槛券
手把手带您无忧上云