简体   繁体   中英

Filter array of objects by nested array of object value

Suppose I have an array of objects, each of which contains a nested array of objects likes :

[
  {
    id: 1,
    title: 'Lorem',
    private: false,
    likes: [
      { id: 01, username: 'mike' },
      { id: 02, username: 'john' }
    ]
  },
  {
    id: 2,
    title: 'Ipsum',
    private: true,
    likes: [
      { id: 03, username: 'steve' },
      { id: 04, username: 'mike' },
      { id: 05, username: 'sara' }
    ]
  },
  {
    id: 3,
    title: 'Dolor',
    private: false,
    likes: [
      { id: 06, username: 'brad' },
      { id: 07, username: 'cameron' },
      { id: 08, username: 'liam' }
    ]
  }
]

How can I filter the outer array by the username value inside its items nested array? Let's say output the items that contains in its inner arrays objects with property username: 'mike' ?

You could filter by looking into the nested array.

 var data = [{ id: 1, title: 'Lorem', private: false, likes: [{ id: 01, username: 'mike' }, { id: 02, username: 'john' }] }, { id: 2, title: 'Ipsum', private: true, likes: [{ id: 03, username: 'steve' }, { id: 04, username: 'mike' }, { id: 05, username: 'sara' }] }, { id: 3, title: 'Dolor', private: false, likes: [{ id: 06, username: 'brad' }, { id: 07, username: 'cameron' }, { id: 08, username: 'liam' }] }], result = data.filter(({ likes }) => likes.some(({ username }) => username === 'mike')); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

Use filter and some functions:

 const input = [{ id: 1, title: "Lorem", private: false, likes: [{ id: 1, username: "mike" }, { id: 2, username: "john" }] }, { id: 2, title: "Ipsum", private: true, likes: [{ id: 3, username: "steve" }, { id: 4, username: "mike" }, { id: 5, username: "sara" } ] }, { id: 3, title: "Dolor", private: false, likes: [{ id: 6, username: "brad" }, { id: 7, username: "cameron" }, { id: 8, username: "liam" } ] } ]; const criteria = { username: "mike" }; const result = input.filter(x => x.likes.some(y => y.username === criteria.username) ); console.log(result);

you can use 'map' function to filter the internal array

const data = [
{
    id: 1,
    title: 'Lorem',
    private: false,
    likes: [
      { id: 1, username: 'mike' },
      { id: 2, username: 'john' }
    ]
  },
  {
    id: 2,
    title: 'Ipsum',
    private: true,
    likes: [
      { id: 3, username: 'steve' },
      { id: 4, username: 'mike' },
      { id: 5, username: 'sara' }
    ]
  },
  {
    id: 3,
    title: 'Dolor',
    private: false,
    likes: [
      { id: 6, username: 'brad' },
      { id: 7, username: 'cameron' },
      { id: 8, username: 'liam' }
    ]
  }
]

const res = data.map( item => {
  let likes = item.likes.filter( user => user.username === 'mike')
  if(likes.length > 0 ) {
    item.likes = likes 
    return item
  }
  return null 
}).filter(item => item !== null )

console.log(res)

use filter and find in likes.

 const filter = (data, name) => data.filter(({ likes }) => likes.find(({ username }) => username === name)); const data = [ { id: 1, title: "Lorem", private: false, likes: [ { id: 01, username: "mike" }, { id: 02, username: "john" }, ], }, { id: 2, title: "Ipsum", private: true, likes: [ { id: 03, username: "steve" }, { id: 04, username: "mike" }, { id: 05, username: "sara" }, ], }, { id: 3, title: "Dolor", private: false, likes: [ { id: 06, username: "brad" }, { id: 07, username: "cameron" }, { id: 08, username: "liam" }, ], }, ]; console.log(filter(data, "mike")); console.log(filter(data, "blah"));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM