js不使用递归,还有哪些方法遍历多层级对象

116 阅读1分钟

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'
  }
};