const set = new Set(); function Walk(obj, parentObject, propertyName, path=[]) { if(obj !== null && typeof obj === "object") { if(set.has(obj)) { console.log("ive been to", obj, "quitting"); return; } else { set.add(obj); console.log("ive never seen", obj, "here are its fields:"); console.log("-----------------"); for(let key in obj) { const val = obj[key]; console.log(key, val); Walk(val, obj, key); } console.log("-----------------"); } } else { console.log(obj, "is a leaf") } } const root = {hey:"1", deep:{}, arr:["a", "b"]}; root.circ = root; Walk(root);