[英]Mapping and filtering a nested object
我正在尝试查找包含具有Industry
Name
和Tech
Value
的过滤器的所有对象。 这是我的对象:
const obj = [{
"Id": 1,
"Name": "Video Games",
"Labels": [{
"Name": "Industry",
"Value": "TMT"
},
{
"Name": "Analyst",
"Value": "Jen Cardage"
}
]
},
{
"Id": 2,
"Name": "Software",
"Labels": [],
},
{
"Id": 3,
"Name": "Internet",
"Labels": [{
"Name": "Industry",
"Value": "Tech"
},
{
"Name": "Analyst",
"Value": "Mike Smith"
}
]
}
]
这让我得到带有非空Labels
对象,在这种情况下, Id
s 1
和3
。
const containsLabels = obj.filter(({Labels}) => Labels.length > 0);
但是,我似乎无法弄清楚如何将另一个map
和/或filter
到containsLabels
以映射并检查其中包含的Name
和Value
。
如何从containsLabels
获取Id: 3
的对象? 我的运行代码在这里。
标签是一个数组(与 obj 一样),因此运行find()
嵌套应该可以解决问题:
const containsLabels = obj.filter(({ Labels }) =>
Labels.find(({ Name, Value }) => Name === 'Industry' && Value === 'Tech')
);
没有必要过滤Label.length > 0
对象,因为find()
在空数组上运行时将return null
。
如果Labels
不总是存在,上面的代码会抛出一个错误。 相反,您可以使用可选的链接运算符( ?.
) 或传统的&&
:
const containsLabels = obj.filter(({ Labels }) =>
Labels?.find(({ Name, Value }) => Name === 'Industry' && Value === 'Tech')
);
// Or...
const containsLabels = obj.filter(({ Labels }) =>
Labels && Labels.find(({ Name, Value }) => Name === 'Industry' && Value === 'Tech')
);
你可以直接在第一个filter
find
const containsLabels = obj.filter(({ Labels }) =>
Labels.find(Label => Label.Value === 'Tech')
)
console.log(containsLabels)
可运行示例
const obj = [ { Id: 1, Name: 'Video Games', Labels: [ { Name: 'Industry', Value: 'TMT' }, { Name: 'Analyst', Value: 'Jen Cardage' } ] }, { Id: 2, Name: 'Software', Labels: [] }, { Id: 3, Name: 'Internet', Labels: [ { Name: 'Industry', Value: 'Tech' }, { Name: 'Analyst', Value: 'Mike Smith' } ] } ] const containsLabels = obj.filter(({ Labels }) => Labels.find(Label => Label.Value === 'Tech') ) console.log(containsLabels)
或者只是继续链接,如果你愿意,因为filter
返回相同元素但过滤的新数组
const containsLabels = obj
.filter(({ Labels }) => Labels.length > 0)
.filter(({ Labels }) => Labels.find(Label => Label.Value === 'Tech'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.