- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想在 Javascript 中继承一个对象来寻找特定的字符串。不幸的是,这个对象的构建方式不可能简单地为该字符串使用源和 Ctrl-F,而且它的构建方式使得试图下降它的递归函数有被困在其中的风险永远。
基本上,这个对象包含它自己。不只是一次,而是在很多领域。我不能简单地说“排除这些键”,因为对象被混淆了,因此我们会整天在这里列出键,一旦完成,我们就不会查看所有数据。
同样,我需要能够继承 __proto__
和 prototype
,因为有用的字符串也隐藏在其中。 (但仅适用于函数和对象。)
虽然我更喜欢类似findStuff(object,/string/ig)
的方法,但这可能很难,所以任何函数只要明确标记了控制流落入的区域一旦找到特定对象(函数、字符串等)
谢谢你,很抱歉这个屁股问题让你这么痛苦。
编辑:如果有帮助,我正在尝试遍历已编译的 Construct2 运行时对象。我不会在这里发布完整的东西,因为无论多么宽容,它都不适合任何 pastebin,而且我不想意外发布我没有权限提供的资源。 (不过别担心,我不是想自己盗版,我只是想找出一些面向用户的功能)
最佳答案
您可以使用 WeakSet 来跟踪已经遍历的对象:
function traverseOnce(obj, cb) {
const visited = new WeakSet();
(function traverse(obj) {
for(const [key, value] of Object.entries(obj)) {
if(typeof value === "object" && value !== null) {
if(visited.has(value)) continue;
visited.add(value);
cb(value);
traverse(value);
}
}
})(obj);
}
通过 WeakSet,您获得了 O(1) 的查找时间,并且确信这永远不会泄漏。
可用作:
const nested = { other: { a: 1 } };
nested.self = nested;
traverseOnce(nested, console.log);
// nested: { other, self }
// other: { a: 1 }
您还可以使用 Symbol 来标记遍历的对象,因为将 new WeakSet()
替换为 Symbol()
,visited.has(value)
与 value[visited]
和 visuted.add(value)
与 value[visited] = true;
关于javascript - 有没有办法在 JavaScript 中遍历可能自包含的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55575700/
我是一名优秀的程序员,十分优秀!