深入了解对象以满足条件并返回高于级别的属性



考虑以下对象

{
"objects": [
{
"body": "body 1", 
"title": "Jolene", 
"authors": [{
"name": "Dolly"
},
{
"name": "John"
}]
},
{
"body": "body 2", 
"title": "Jolene", 
"authors": [{
"name": "Dolly Parton"
}]
}
]
}

我的目标是验证每个对象authors属性,如果其中一个作者name符合条件,我希望它返回该对象的body

例如,我想渲染至少有一个authorsname等于"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);

如果需要多个匹配项,可以使用filtermap

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'])
})
	}
})

最新更新