我有一个javascript对象,我想递归地搜索它,以查找包含特定值的任何属性。
我正在使用的javascript已经被缩小了,并且不那么容易跟踪。
背景
使用Bing Maps AJAX SDK它能够添加额外的平铺层。每个平铺层都有一个tilesource对象,该对象指定平铺URL的URI格式。
我遇到了一个问题,即tilesource URI只创建一次,然后缓存。因此,我不能为每个请求动态更改URL的参数(例如,根据一天中的时间更改平铺覆盖的颜色)。
请注意,此行为与Google的Map API和WP7的Bing Maps API不同,它们都允许您为每个磁贴请求动态创建URL。
查找高速缓存的URI,并且替换两个特定参数,然后使用URI来获取图块。
由于这是javascript,我想找到缓存的URI,并将其替换为一个函数,该函数动态构建URI并返回它。
我不需要在每次运行时都这样做,只需要知道属性缓存在哪里,这样我就可以编写代码来实现它。
原始问题
如果我将URI设置为“floobieblaster”这样的值,当我设置断点时,我可以递归地搜索javascript对象“floobieblaster”并获得存储该值的属性吗?
编辑添加
我正在搜索的对象似乎有一个循环引用,因此任何递归代码都可能导致堆栈溢出。
是否有任何编辑器/调试器技巧我可以使用?
7条答案
按热度按时间5jdjgkvh1#
像这样简单的东西应该可以工作:
如果执行
searchObj(testObj, 'testValue');
,它会将以下内容记录到控制台:显然,您可以用任何您想要的东西替换
console.log
,或者向searchObj
函数添加一个回调参数,以使其更易于重用。**编辑:**新增
query
参数,可以指定调用函数时要搜索的值。monwx1rj2#
此函数将在对象中搜索。当你需要在多维对象中进行搜索时,这是很有用的。花了几个小时,我从谷歌的AngularJS项目得到了这段代码。
sshcrbum3#
这里有一些解决这个老问题的现代方法。您可以扩展它以满足您自己的需要。假设以下数据结构:
获取
col3
属性为C的对象的键数组:这将返回
['row1', 'row3']
。获取
col3
属性为C的行的新对象:这将返回
请注意,上面的答案是从similar question导出的。
eivnm1vs4#
这是我的解决方案,它用正则表达式测试匹配给定的字符串/值,并返回匹配的数组。它不是递归的,但是你已经从你的问题中删除了它。
这是我在下面的帖子中的回答:搜索JavaScript对象
与其他人建议的相同的原则-为给定值搜索对象,为任何搜索此解决方案的人。
功能:
您的目标:
使用说明:
(This将在myObject.elems数组中搜索匹配'FC'的'name')
结果-检查您的控制台:
如果你想要一个精确的匹配,你只需要将三进制语句中的正则表达式改为基本的值匹配。即
0pizxfdo5#
下面是一个基于Bryan方法的更方便的现成静态方法:
对于对象
将导致
e4eetjau6#
我编辑了Bryan Downing answer来打印深度对象的层次结构:
然后,运行
searchObj(testObj, 'testValue');
lfapxunr7#
以下是@Hardik Sondagar回答的修改版本:
这些变化是:
试试看:
在新标签页中(在Chrome上测试)