解题思路
-
- 首先要判断当前传入的是一个对象否,是则对当前对象进行遍历,否则返回false
-
- 如果是对象,先将当前对象保存到数组中,然后对对象进行遍历
-
- 判断对象的每个值是否是一个对象 如果不是的话就跳出当前循环
-
- 如果是的话,判断对象的每个值是否存在数组中,如果存在表示是循环引用
-
- 反之则进行递归 将当前的对象的值和保存对象的数组传入递归函数
<script>
const a = {}
const b = {
name: 'zs',
info: {
age: 18,
self: a
}
}
a.b = b
console.log(a)
function hasLoop(obj) {
function findLoop(target, src) {
const source = [...src, target]
for (const key in target) {
if (typeof target[key] !== 'object') continue
if (source.includes(target[key]) || findLoop(target[key], source)) return true
}
}
return typeof obj === "object" ? findLoop(obj, []) : false
}
console.log(hasLoop(a))
/**
* 思路
* 1. 首先要判断当前传入的是一个对象否,是则对当前对象进行遍历,否则返回false
* 2. 如果是对象,先将当前对象保存到数组中,然后对对象进行遍历
* 3. 判断对象的每个值是否是一个对象 如果不是的话就跳出当前循环
* 4. 如果是的话,判断对象的每个值是否存在数组中,如果存在表示是循环引用
* 5. 反之则进行递归 将当前的对象的值和保存对象的数组传入递归函数
*/
</script>