gpt4 book ai didi

javascript - 如何在深度嵌套的 javascript 库中搜索属性

转载 作者:行者123 更新时间:2023-12-03 12:28:44 24 4
gpt4 key购买 nike

我想要实现的是创建一个函数,帮助我快速检查深层嵌套的 javascript 对象、api 或库中给定属性的存在性,并将结果作为相关路径返回,例如:根/子/子/匹配

这是我到目前为止所得到的:

function findNode(obj, str) {
var results = [], regx = new RegExp(str, "gi");

function innerFind(obj, str, currentPath) {
var i, propName, prop, result;

if (toString.call(obj) === "[object Array]") {
for (i = 0; i < obj.length; i++) {
if (typeof obj[i] === "object") {
innerFind(obj[i], str, currentPath + "[" + i + "]/");
}
}

} else {
for (propName in obj) {
if (regx.test(propName)) {
results.push(currentPath + propName + "/");
}

prop = obj[propName];
if (typeof prop === "object") {
innerFind(prop, str, currentPath + propName + "/");
}
}
}
}

if (typeof obj === "object") {
innerFind(obj, str, "root/");
}

return results;
}

它在中小型对象上完美工作,但在较大对象上失败并出现错误:RangeError:超出最大调用堆栈大小。据我所知,抛出错误是因为函数 innerFind 在其内部被多次调用。

所以我的问题是,如何使上述函数正常工作而不出现 RangeError 错误?有没有更好更有效的方法来做到这一点?

最佳答案

您尝试解析的“大”对象中有一个循环引用。如果您不知道什么是循环引用,请参阅以下示例:

var obj = {
child: null
}
obj.child = obj;

您将无法使用该对象运行您的函数,因为它具有对自身的引用,使您的脚本永远运行并最终超出堆栈大小。

“修复”你的函数很困难,因为找到这些引用绝非易事。这些循环引用本身可能非常复杂。

关于javascript - 如何在深度嵌套的 javascript 库中搜索属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24045380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com