Фильтровать массив объектов по вложенному массиву значений объекта - PullRequest
2 голосов
/ 30 мая 2020

Предположим, у меня есть массив объектов, каждый из которых содержит вложенный массив объектов 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' }
    ]
  }
]

Как я могу отфильтровать внешний массив по значению имени пользователя внутри вложенного массива элементов? Допустим, вывести элементы, содержащие в своих внутренних массивах объекты со свойством username: 'mike'?

Ответы [ 4 ]

0 голосов
/ 30 мая 2020

используйте filter и find в лайках.

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"));
0 голосов
/ 30 мая 2020

Использовать фильтр и некоторые функции:

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);
0 голосов
/ 30 мая 2020

вы можете использовать функцию 'map' для фильтрации внутреннего массива

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)
0 голосов
/ 30 мая 2020

Вы можете отфильтровать, просмотрев вложенный массив.

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; }
...