Копаться в объект, чтобы выполнить условие и возвращает свойство, которое находится на уровнях выше - PullRequest
0 голосов
/ 02 июня 2018

Учитывая следующий объект

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

Моя цель проверить свойство каждого объекта authors и, если один из авторов name соответствует критериям, я хочу, чтобы он возвратил body такого объекта.

Например, я хочу отобразить содержимое body объекта, в котором хотя бы один authors name равен "John".В этом случае "body 1" должно быть возвращено.

Я пытался с отображением и фильтрацией, но я не могу понять, как копаться в каждом объекте, чтобы проверить это условие, а затем вернуть свойство, которое живет в более высокомуровень.

Пожалуйста, помогите!Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Вы можете использовать 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);
0 голосов
/ 02 июня 2018

Это может выглядеть немного глючно, но вы определенно получите решение

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'])
      })
	}
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...