我们如何在递归无法到达的 JavaScript 中的非常嵌套的数组中获取键?
How do we get a key in a very nested array in JavaScript that recursion can't get to?
所以我似乎找到了我认为可以轻松解决的最终问题,但我个人在所有论坛上研究了 3 小时后放弃了 XD。
所以我访问了一个包含 webplayer.js 文件的在线 React 网站。在这个包中,我们有一个非常大的嵌套数组,它存储应用程序的所有变量,并且在超过递归限制之前没有递归函数可以进入。
我想在这个 js 文件中访问一个变量的原因是能够用我自己的 js 文件操作一个变量(试图创建一个 plugin/tampermonkey 脚本,虽然 XD 从来没有这样做过)。所以我想在大型数组中找到这个特定的键,例如 chrome 控制台,以便能够对其进行编辑。
如果我想在这里操作一个位于这个大数组中的变量,例如:("video-autoplay" : true)
,我现在在 chrome 中能够做到这一点的唯一方法是:
- 在 webplayer.js 设置
var autoPlay = Key to ("video-autoplay" : true)
的地方放置一个断点
- 断点命中时手动编辑变量...
之所以可行,是因为当我到达断点时,我进入了与该变量相同的范围,现在我可以简单地从 chrome 控制台键入 autoPlay = False;
但要使其自动化,我不能依赖于设置断点,因此我需要以某种方式能够访问非常大的数组中的这个键。
是否有一个 javascript 函数可以在不进行递归搜索的情况下获取此密钥,可能是通过哈希 ID(然后使用某种查找 table?)或类似的东西,我可以检查当我击中 var autoPlay = ...
的断点并尝试找到一种可能在我超出范围后再次唯一到达该变量的方法。 (我确实尝试将它添加到监视列表中,但一旦断点继续并超出范围,它就会再次被删除)
所以总而言之,我相信在构建生产文件时,编码的 React 变量会变成一个嵌套变量数组。因此,如果 React 能够设法立即访问嵌套数组中的这些变量,它让我相信必须有某种查找 table,我们应该能够说 var unreachableKey = GetKeyFromNestedArray("video-autoplay")??
非常感谢! :D
编辑附加的代码片段:
这是我可以找到变量并简单地放置一个断点的地方之一。
ps。原始文件说 r = t.videoAutoPlay
我将其更改为 r = t.video-autoplay
以匹配所有内容 :D
您可以使用以下语法访问对象矩阵的元素:
let array = {"arr": {"nested1":{"nested2":{"nested3": "Hello!"}}}};
let deep = array["arr"]["nested1"]["nested2"]["nested3"];
console.log(deep);
我已经成功地找到了这个非常嵌套和讨厌的键(不仅有字典,还有混合字典和列表)!如果需要的话,我可能会在未来为任何人分享代码。我可能会说这是一个设法得到它的递归函数,我之前无法得到它的原因是在 Whosebug 上发布的此类函数的大部分代码也迭代了每个字符串中的每个字符,因为 Object.keys()
函数还将字符串拆分为单独的字符,这使得递归深度变得非常深!
所以这是一个精炼的代码:
function findByKey(obj, key) {
if(obj==null || obj==undefined ){
return;
}
if(obj.constructor === Object || obj.constructor === Array){
var keys = Object.keys(obj);
for(i in keys){
var i = keys[i];
if(key == i){
return obj;
}else{
var test = findByKey(obj[i], key);
if(test != undefined){
return test;
}
}
}
}else if(obj == key){
return key;
}
return;
}
非常感谢用户 wOxxOm 指出这样的函数应该能够使用递归深度,因此我可以设法找出问题所在。
所以我似乎找到了我认为可以轻松解决的最终问题,但我个人在所有论坛上研究了 3 小时后放弃了 XD。
所以我访问了一个包含 webplayer.js 文件的在线 React 网站。在这个包中,我们有一个非常大的嵌套数组,它存储应用程序的所有变量,并且在超过递归限制之前没有递归函数可以进入。
我想在这个 js 文件中访问一个变量的原因是能够用我自己的 js 文件操作一个变量(试图创建一个 plugin/tampermonkey 脚本,虽然 XD 从来没有这样做过)。所以我想在大型数组中找到这个特定的键,例如 chrome 控制台,以便能够对其进行编辑。
如果我想在这里操作一个位于这个大数组中的变量,例如:("video-autoplay" : true)
,我现在在 chrome 中能够做到这一点的唯一方法是:
- 在 webplayer.js 设置
var autoPlay = Key to ("video-autoplay" : true)
的地方放置一个断点
- 断点命中时手动编辑变量...
之所以可行,是因为当我到达断点时,我进入了与该变量相同的范围,现在我可以简单地从 chrome 控制台键入 autoPlay = False;
但要使其自动化,我不能依赖于设置断点,因此我需要以某种方式能够访问非常大的数组中的这个键。
是否有一个 javascript 函数可以在不进行递归搜索的情况下获取此密钥,可能是通过哈希 ID(然后使用某种查找 table?)或类似的东西,我可以检查当我击中 var autoPlay = ...
的断点并尝试找到一种可能在我超出范围后再次唯一到达该变量的方法。 (我确实尝试将它添加到监视列表中,但一旦断点继续并超出范围,它就会再次被删除)
所以总而言之,我相信在构建生产文件时,编码的 React 变量会变成一个嵌套变量数组。因此,如果 React 能够设法立即访问嵌套数组中的这些变量,它让我相信必须有某种查找 table,我们应该能够说 var unreachableKey = GetKeyFromNestedArray("video-autoplay")??
非常感谢! :D
编辑附加的代码片段:
这是我可以找到变量并简单地放置一个断点的地方之一。
ps。原始文件说 r = t.videoAutoPlay
我将其更改为 r = t.video-autoplay
以匹配所有内容 :D
您可以使用以下语法访问对象矩阵的元素:
let array = {"arr": {"nested1":{"nested2":{"nested3": "Hello!"}}}};
let deep = array["arr"]["nested1"]["nested2"]["nested3"];
console.log(deep);
我已经成功地找到了这个非常嵌套和讨厌的键(不仅有字典,还有混合字典和列表)!如果需要的话,我可能会在未来为任何人分享代码。我可能会说这是一个设法得到它的递归函数,我之前无法得到它的原因是在 Whosebug 上发布的此类函数的大部分代码也迭代了每个字符串中的每个字符,因为 Object.keys()
函数还将字符串拆分为单独的字符,这使得递归深度变得非常深!
所以这是一个精炼的代码:
function findByKey(obj, key) {
if(obj==null || obj==undefined ){
return;
}
if(obj.constructor === Object || obj.constructor === Array){
var keys = Object.keys(obj);
for(i in keys){
var i = keys[i];
if(key == i){
return obj;
}else{
var test = findByKey(obj[i], key);
if(test != undefined){
return test;
}
}
}
}else if(obj == key){
return key;
}
return;
}
非常感谢用户 wOxxOm 指出这样的函数应该能够使用递归深度,因此我可以设法找出问题所在。