假设我有一个物体:
[
{
'title': "some title"
'channel_id':'123we'
'options': [
{
'channel_id':'abc'
'image':'http://asdasd.com/all-inclusive-block-img.jpg'
'title':'All-Inclusive'
'options':[
{
'channel_id':'dsa2'
'title':'Some Recommends'
'options':[
{
'image':'http://www.asdasd.com' 'title':'Sandals'
'id':'1'
'content':{
...
我想找一个id为1的对象。有这样的函数吗?我可以使用下划线的_.filter
方法,但我必须从顶部开始并向下过滤。
22条答案
按热度按时间eeq64g8w1#
递归是你的朋友。我更新了该函数以说明属性数组:
已更新jsFdle:http://jsfiddle.net/FM3qu/7/
7d7tgy0s2#
对我来说起作用的是这种懒惰的方法,而不是算法上的懒惰;)
piztneat3#
另一个(有些愚蠢的)选择是利用
JSON.stringify
的自然递归特性,并向其传递一个替换函数,该函数在字符串化过程中在每个嵌套对象上运行:qc6wkl3g4#
如果您想在搜索Object时获取id为1的第一个元素,可以使用以下函数:
如果要获取id为1的所有元素,则(id为1的所有元素都存储在Result中,如您所见):
f2uvfpb95#
改进了@haitaka答案,使用了键和 predicate
因此,可以按如下方式调用:
或
以下是演示:http://jsfiddle.net/a21dx6c0/
已编辑
同样,您可以找到不止一个对象
px9o7tmv6#
我通过谷歌搜索找到了这个页面,寻找类似的功能。基于Zach和Regarmike提供的工作,我创建了另一个适合我需求的版本。
顺便说一句,交通工作和规则!我将在此处发布代码:
它所做的是在
obj
中查找属性名称和值与targetProp
和targetValue
匹配的任何对象,并将其推送到finalResults
数组。下面是可供使用的jsfiddle:https://jsfiddle.net/alexQch/5u6q2ybc/hsvhsicv7#
为此,我创建了库:https://github.com/dominik791/obj-traverse
您可以这样使用
findFirst()
方法:现在
foundObject
变量存储了对您正在查找的对象的引用。hgb9j2n68#
另一种递归解决方案,适用于数组/列表和对象,或两者的混合:
用法:
cbwuti449#
如果您对整个ES6感兴趣,您可以使用
按值查找将略有不同
那么它们就可以像这样使用
x6492ojm10#
我们使用object-scan进行数据处理。它在概念上非常简单,但允许很多很酷的东西。以下是您将如何解决您的特定问题
px9o7tmv11#
您可以在递归函数中使用javascript
some
函数。有些方法的优点是,一旦孩子被发现,就可以停止循环。不要使用在大数据中速度较慢的Map。tzdcorbm12#
@Iulian Pinzaru的答案几乎就是我需要的,但如果您的对象有任何空值,它就不起作用。这个版本解决了这个问题。
ldxq2e6h13#
只要使用递归函数即可。
请参见下面的示例:
zpqajqem14#
1.检测深度嵌套对象中的键。
1.最后返回检测到的key的值。
42fyovps15#
改进了答案,以考虑对象内的循环引用。它还显示了它到达那里的路径。
在本例中,我正在搜索我知道位于全局对象中某个位置的IFrame:
运行以下命令:
getObject(reader, 'reader')
将显示以下输出和最后的iframe元素:注意:路径的顺序与
reader.book.rendition.manager.views._views.iframe
相反