Как фильтровать массив объектов на основе содержимого дочернего массива?

#javascript #arrays

#javascript #массивы

Вопрос:

У меня есть эти данные

 var data = [
  {
    title: "App development summary",
    category: [],
  },
  {
    title: "to experiment 2",
    category: [],
  },
  {
    title: "Some of these books I have read",
    category: [
      {
        _id: "5f7c99faab20d14196f2062e",
        name: "books",
      },
      {
        _id: "5f7c99faab20d14196f2062f",
        name: "to read",
      },
    ],
  },
  {
    title: "Quora users and snippets",
    category: [
      {
        _id: "5f7c99feab20d14196f20631",
        name: "quora",
      },
    ],
  },
  {
    title: "Politics to research",
    category: [
      {
        _id: "5f7c9a02ab20d14196f20633",
        name: "politics",
      },
    ],
  },
];
  

Допустим, я хочу получить все записи с категорией books . Я пытался сделать это:

 var bookCat = data.map(note => {
 return note.category.map(cat => {
   if(cat.name === "books" ) return note
 })
}) 
  

Но результат возвращается с некоторыми пустыми и неопределенными массивами.

Я смог отфильтровать пустые массивы (в какой-то момент), но не неопределенные

введите описание изображения здесь

Редактировать

На простом английском языке «если объект ha category.name «книги», дайте мне название».

Комментарии:

1. Вы хотите name: "to read", , чтобы объект был включен?

2. @CertainPerformance да, это часть категорий. Я пытаюсь получить книгу с категорией «книга» тот факт, что она также имеет категорию «для чтения», не имеет значения.

3. Пожалуйста, покажите пример результатов, которые вы ожидаете получить

4. @Phil результатом вышеизложенного будет data[2] то, что это единственный объект с категорией book . Я неправильно истолковал данный ответ. код действительно работает, но не зацикливается. Если бы существовал другой объект, подобный data[2] коду, указанному в первом ответе, не отображал бы его. это jsbin.com/popibedugu/edit?js , консоль выбирает правильный вариант, но не учитывает другой

Ответ №1:

Фильтровать по category тому, содержит ли массив хотя бы один name , который books :

 var data=[{title:"App development summary",category:[]},{title:"to experiment 2",category:[]},{title:"Some of these books I have read",category:[{_id:"5f7c99faab20d14196f2062e",name:"books"},{_id:"5f7c99faab20d14196f2062f",name:"to read"}]},{title:"Quora users and snippets",category:[{_id:"5f7c99feab20d14196f20631",name:"quora"}]},{title:"Politics to research",category:[{_id:"5f7c9a02ab20d14196f20633",name:"politics"}]}];

const output = data
  .filter(item => item.category.some(
    ({ name }) => name === 'books'
  ));
console.log(output);  

Если гарантированно будет только один соответствующий объект, используйте .find вместо:

 var data=[{title:"App development summary",category:[]},{title:"to experiment 2",category:[]},{title:"Some of these books I have read",category:[{_id:"5f7c99faab20d14196f2062e",name:"books"},{_id:"5f7c99faab20d14196f2062f",name:"to read"}]},{title:"Quora users and snippets",category:[{_id:"5f7c99feab20d14196f20631",name:"quora"}]},{title:"Politics to research",category:[{_id:"5f7c9a02ab20d14196f20633",name:"politics"}]}];

const output = data
  .find(item => item.category.some(
    ({ name }) => name === 'books'
  ));
console.log(output);  

Комментарии:

1. Это не то, чего я хочу. Я хочу, чтобы весь родительский элемент категории

2. На простом английском языке «если объект ha category.name «книги», дайте мне название». Вот с чем у меня возникли проблемы: получение родительского массива в тот момент, когда я отфильтровал название категории.

3. Еще раз извините, что, если есть два объекта с категорией «книги». jsbin.com/popibedugu/edit?js , консоль я добавил еще одну запись и не показывает

4. @relidon Похоже, это работает? Он показывает результирующий массив длиной 2 — оба объекта с books включенным get