【问题标题】:Filter array of objects where one field in object is array过滤对象数组,其中对象中的一个字段是数组
【发布时间】:2019-05-17 19:52:29
【问题描述】:
 data:[
        {
           id:1,
           tags:['TagA','TagB','TagC']
         },
         {
           id:2,
           tags:['TagB','TagD']
         },
         {
            id:3,
            tags:['tagE','tagC']
         }
      ]

filterCondition:{tags:['TagA','TagB']}

Expected Output: [
                   {
                     id:1,
                     tags:['TagA','TagB','TagC']
                   },
                   {
                     id:2,
                     tags:['TagB','TagD']
                   }
                 ]

有没有办法在打字稿中使用过滤器方法来实现这一点? 当 tags 字段不是数组但它在数组中时,它是可能的 代码中断。

我试过了,但失败了:

   data.filter(o => Object.keys(filterCondition).every(k => filterCondition[k].some(f => o[k] === f)));

【问题讨论】:

  • typescript 是 js 的超集,所以 js 解决方案会起作用,因为它是 js

标签: javascript arrays angular typescript


【解决方案1】:

您可以使用filterincludes

const data = [{id:1,tags:['TagA','TagB','TagC']},{id:2,tags:['TagB','TagD']},{id:3,tags:['tagE','tagC']}];
      
const filterData = tag => data.filter(d => tag.some(t => d.tags.includes(t)));

console.log(filterData(['TagA', 'TagB']));

提到的条件数组形式的小编辑:

    let filterArray={tags:['TagA','TagB']}

    const data = [{id:1,tags:['TagA','TagB','TagC']},{id:2,tags:['TagB','TagD']},{id:3,tags:['tagE','tagC']}];

    output= data.filter(o => Object.keys(filterArray).every(d => filterArray[d].some(t => o[d].includes(t))));

【讨论】:

  • 我想根据 'filterCondition' 数组过滤它,因此当 filterCondition:{tags:['tagA','tagB']}
  • 它基于您在问题中描述的那个数组,请解释您的意思并举例说明
  • Artyom Amiryan,请参阅编辑后的示例。如果条件数组中的任何标签存在于对象中,则该对象应该存在于输出中
  • @RishabhBharatGada 我已经更新了我的示例,请检查是否是您需要的?
【解决方案2】:

const s = {
  data: [{
      id: 1,
      tags: ['TagA', 'TagB', 'TagC']
    },
    {
      id: 2,
      tags: ['TagB', 'TagD']
    },
    {
      id: 3,
      tags: ['tagE', 'tagC']
    }
  ],
  filterCondition: {
    tags: ['TagA', 'TagB']
  }
};

console.log(s.data.filter(a => s.filterCondition.tags

  .some(s => a.tags.join(',').includes(s))));

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2018-10-03
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多