考虑以下对象
{
"objects": [
{
"body": "body 1",
"title": "Jolene",
"authors": [{
"name": "Dolly"
},
{
"name": "John"
}]
},
{
"body": "body 2",
"title": "Jolene",
"authors": [{
"name": "Dolly Parton"
}]
}
]
}
我的目标是验证每个对象authors
属性,如果其中一个作者name
符合条件,我希望它返回该对象的body
。
例如,我想渲染至少有一个authors
name
等于"John"
的对象body
内容。在这种情况下,应返回"body 1"
。
我已经尝试过映射和过滤,但我无法弄清楚如何深入研究每个对象以验证该条件,然后返回位于更高级别的属性。
请帮忙!多谢!
您可以使用find
搜索第一个匹配项。使用some
检查是否至少有一个名称匹配。
let obj={"objects":[{"body":"body 1","title":"Jolene","authors":[{"name":"Dolly"},{"name":"John"}]},{"body":"body 2","title":"Jolene","authors":[{"name":"Dolly Parton"}]}]}
let toSearch = "John";
let result = (obj.objects.find(o => o.authors.some(x => x.name === toSearch)) || {body: ""}).body;
console.log(result);
如果需要多个匹配项,可以使用filter
和map
let obj={"objects":[{"body":"body 1","title":"Jolene","authors":[{"name":"Dolly"},{"name":"John"}]},{"body":"body 1.5","title":"Jolene","authors":[{"name":"Dolly"},{"name":"John"}]},{"body":"body 2","title":"Jolene","authors":[{"name":"Dolly Parton"}]}]}
let toSearch = "John";
let result = obj.objects.filter(o => o.authors.some(x => x.name === toSearch)).map(o => o.body);
console.log(result);
这可能看起来有点问题,但你肯定会得到一个解决方案
var obj = {
"objects": [
{
"body": "body 1",
"title": "Jolene",
"authors": [{
"name": "Dolly"
},
{
"name": "John"
}]
},
{
"body": "body 2",
"title": "Jolene",
"authors": [{
"name": "Dolly Parton"
}]
}
]
}
obj["objects"].forEach(item=>{
if(item.authors){
item.authors.forEach(items=>{
if(items.name == 'Dolly') console.log(item['body'])
})
}
})