通过对象值的嵌套数组过滤对象数组

问题描述 投票:1回答:3

假设我有一个对象数组,每个对象都包含一个嵌套的对象数组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'

的对象
javascript arrays multidimensional-array ecmascript-6 filter
3个回答
0
投票

您可以通过查看嵌套数组进行过滤。

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

0
投票

使用过滤器和某些功能:

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
投票

您可以使用'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)
© www.soinside.com 2019 - 2024. All rights reserved.