1、循环遍历
// 定义多层级对象
const obj = {
name: '张三',
age: 18,
address: {
province: '北京市',
city: '北京市',
district: '海淀区',
street: '中关村街道'
},
contact: {
mobile: '13888888888',
email: 'zhangsan@example.com'
}
};
// 定义遍历函数
function traverse(obj) {
const stack = [obj]; // 使用栈存储待遍历的对象
while (stack.length > 0) {
const current = stack.pop();
for (let key in current) {
const value = current[key];
if (typeof value === 'object') {
stack.push(value); // 将子对象压入栈中
} else {
console.log(`${key}: ${value}`); // 输出键值对
}
}
}
}
// 示例用法
traverse(obj);
使用了一个 stack 数组来存储待遍历的对象。在遍历开始时,将根对象放入栈中,然后进入循环。
在每次循环中,从栈顶取出当前要遍历的对象 current,然后使用 for...in 循环遍历该对象的每个属性 key,并判断该属性对应的值是否为对象。如果是对象,则将其压入栈中;否则,输出该键值对。
最后,在栈为空时,遍历结束。
2、使用迭代器
const obj = {
name: '张三',
age: 18,
address: {
province: '北京市',
city: '北京市',
district: '海淀区',
street: '中关村街道'
},
contact: {
mobile: '13888888888',
email: 'zhangsan@example.com'
}
};
function* traverse(obj) {
for (let key in obj) {
const value = obj[key];
if (typeof value === 'object') {
yield* traverse(value);
} else {
yield { key, value };
}
}
}
for (let item of traverse(obj)) {
console.log(`${item.key}: ${item.value}`);
}
在上面的代码中,通过定义一个名为 traverse 的生成器函数,使用 yield 关键字生成遍历结果。其中,yield* 可以用于遍历嵌套的对象。
上面方法同样适用于遍历类似下面的多级对象数组嵌套结构
const obj = {
name: '张三',
age: 18,
address: [
{
province: '北京市',
city: '北京市',
district: '海淀区',
street: '中关村街道'
},
{
province: '湖南省',
city: '长沙市',
district: '岳麓区',
street: '麓山南路'
}
],
contact: {
mobile: '13888888888',
email: 'zhangsan@example.com'
}
};