【问题标题】:Filter array of objects by nested array of object value通过对象值的嵌套数组过滤对象数组
【发布时间】:2020-09-17 13:40:45
【问题描述】:

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

如何通过 items 嵌套数组中的用户名值过滤外部数组?假设输出包含在其内部数组对象中的项目,其属性为username: 'mike'?

【问题讨论】:

    标签: javascript arrays multidimensional-array ecmascript-6 filter


    【解决方案1】:

    在赞中使用filterfind

    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"));

    【讨论】:

      【解决方案2】:

      你可以使用'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)
      

      【讨论】:

        【解决方案3】:

        使用过滤器和一些功能:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 2021-07-08
            • 1970-01-01
            • 1970-01-01
            • 2020-03-08
            • 1970-01-01
            • 2020-03-11
            • 2018-01-16
            • 1970-01-01
            • 2021-10-23
            相关资源
            最近更新 更多