JavaScript循环遍历所有现有对象以查找对象键

JavaScript循环遍历所有现有对象以查找对象键,javascript,json,xmlhttprequest,Javascript,Json,Xmlhttprequest,我正在尝试调试一个由其他人构建的系统。我有一个缩小的库,它对外部数据源进行ajax(xhr)调用,并将接收到的数据写入对象或变量。这个调用是在页面加载后立即进行的,因此我无法通过附加一个函数来注册所有XHR调用请求来捕获它。因此,我试图通过浏览器窗口中的所有变量和对象运行一个循环。我正在尝试: var foundVar=false; loopThroughObject(this); 函数loopThroughObject(obj){ 如果(!foundVar){ 试一试{ for(obj中的变量

我正在尝试调试一个由其他人构建的系统。我有一个缩小的库,它对外部数据源进行ajax(xhr)调用,并将接收到的数据写入对象或变量。这个调用是在页面加载后立即进行的,因此我无法通过附加一个函数来注册所有XHR调用请求来捕获它。因此,我试图通过浏览器窗口中的所有变量和对象运行一个循环。我正在尝试:

var foundVar=false;
loopThroughObject(this);
函数loopThroughObject(obj){
如果(!foundVar){
试一试{
for(obj中的变量名称){
如果(obj[name]&&&{}.toString.call(obj[name])=='[object Function]'){//请确保该对象不是函数
}否则{
如果(name='searchedKey'){//找到了key=searchedKey的对象
console.log(obj[name]);
foundVar=true;
}否则{
setTimeout(loopThroughObject.bind(null,obj[name]),10);//对内部对象进行更多递归
}
}
}
}捕获(错误){}
}
}
问题在于
setTimeout(loopThroughObject.bind(null,obj[name]),0)零件堆叠,出现内存问题。我尝试了简单的
loopThroughObject(obj[name])
,但在25000个循环之后,我面临着“太多递归”错误。我似乎还遗漏了一些东西,这会导致循环遍历一些我不需要的对象类型。有人知道一种更有效的循环方法吗

另外,我尝试了一个非常简单的HTML页面,代码运行良好:

<html>
<head>
<script>
    var test = JSON.parse("{\"searchedKey\":\"12\"}");
    </script>
</head>
<body>
</body>
</html>

var test=JSON.parse(“{\”searchedKey\“:\”12\“}”);

问题几乎可以肯定是
window
有几个指向自身的属性,因此您的代码将进入一个无限循环。很可能还有其他循环引用

使用
集合
,您可以记住已经查找过的对象,如下所示(我还添加了一些其他调整;例如,您可以检查
类型为x==“function”
)的函数:


“调用是在页面加载后立即进行的,因此我无法通过附加一个函数来注册所有XHR调用请求来捕获它。”您可以在另一个脚本之前添加脚本来完成此操作。如果你可以控制页面源代码,你就可以控制事情的顺序。问题是我没有访问源代码的权限。开发人员消失后,客户端失去了对服务器的访问,我们正在尝试重新创建系统。您可以访问服务器,对吗?因此,您可以更改HTML。此外,请注意,并非所有内容都可以从
窗口访问,您要查找的数据很可能位于某个函数的某个变量中。
let foundVar = false;
let seen = new Set();
loopThroughObject(this);

function loopThroughObject(obj) {
    if (!foundVar) {
        try {
            for (const name in obj) {
                const value = obj[name];
                if (typeof value !== "function") {
                    if (name == "searchedKey") { // found the object with key = searchedKey
                        console.log(value);
                        foundVar = true;
                        break;
                    } else if (value && typeof value === "object" && !seen.has(value)) {
                        seen.add(value);
                        loopThroughObject(value); // No need for setTimeout
                    }
                }
            }
        } catch (error) {}
    }
}