我正在尝试查找包含Name
的{{1}}和Industry
的{{1}}的过滤器的所有对象。这是我的对象:
Value
这使我得到非空Tech
的对象,在这种情况下,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
。
1
但是,我似乎无法弄清楚如何将另一个3
和/或const containsLabels = obj.filter(({Labels}) => Labels.length > 0);
链接到map
上以映射并检查filter
和其中包含containsLabels
。
如何从Name
中取出带有Value
的对象?我的运行代码是here。
答案 0 :(得分:3)
标签是一个数组(与obj一样),因此运行find()
嵌套应该可以解决问题:
const containsLabels = obj.filter(({ Labels }) =>
Labels.find(({ Name, Value }) => Name === 'Industry' && Value === 'Tech')
);
我forked your fiddle使用工作版本。
没有必要过滤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')
);
答案 1 :(得分:1)
您可以直接在第一个find
中进行filter
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'))