【问题标题】:How to filter an array of objects by attribute如何按属性过滤对象数组
【发布时间】:2020-04-14 00:37:47
【问题描述】:

我有一个对象数组,如下所示:

finalistsCollection = [
    { name: 'Ann' , sections: [{id: '132', name: 'someName'}, {id: '456', name: 'someName'}] },
    { name: 'Jack' , sections: [{id: '798', name: 'someName'}] },
    { name: 'Morgan', sections: [{id: '456', name: 'someName'}] },
    { name: 'Billy', sections: [{id: '132', name: 'someName'}, {id: '456', name: 'someName'}]}, 
    { name: 'Monica', sections: [{id: '798', name: 'someName'}] }
]

如何通过 id 值过滤这个数组?现在,如果sections 数组内部只有一个对象,我已经进行了过滤:

filter(directionId) {
     filteredCollection = this.finalistsCollection.filter((item) => item.sections[0].id === directionId
}

我尝试在过滤器之后使用map() 函数,但它仍然返回整个数组。

【问题讨论】:

标签: javascript arrays filtering


【解决方案1】:

这个works

let finalistsCollection = [
    { name: 'Ann' , sections: [{id: '132', name: 'someName'}, {id: '456', name: 'someName'}] },
    { name: 'Jack' , sections: [{id: '798', name: 'someName'}] },
    { name: 'Morgan', sections: [{id: '456', name: 'someName'}] },
    { name: 'Billy', sections: [{id: '132', name: 'someName'}, {id: '456', name: 'someName'}]}, 
    { name: 'Monica', sections: [{id: '798', name: 'someName'}] }
]

function filter(directionId) {
     let filteredCollection = finalistsCollection.filter((item) => {
       for (const section of item.sections) {
         if (section.id === directionId) {
           return true
         }
       }
       return false
     })
     console.log(filteredCollection)
}

filter('456')

【讨论】:

    【解决方案2】:

    希望对你有帮助

    let finalistsCollection = [
      { name: 'Ann' , sections: [{id: '132', name: 'someName'}, {id: '456', name: 'someName'}] },
      { name: 'Jack' , sections: [{id: '798', name: 'someName'}] },
      { name: 'Morgan', sections: [{id: '456', name: 'someName'}] },
      { name: 'Billy', sections: [{id: '132', name: 'someName'}, {id: '456', name: 'someName'}]}, 
      { name: 'Monica', sections: [{id: '798', name: 'someName'}] }
    ]
    
    function filter(directionId) {
      return finalistsCollection.filter(item =>
        item.sections.some(x => x.id === directionId)
      );
    }
    
    console.log(filter('456'));
    

    【讨论】:

      【解决方案3】:

      你可以在这里使用一个小技巧作为条件:

      sections.map(section=>section.id).includes(directionId)
      

          finalistsCollection = [
              { name: 'Ann' , sections: [{id: '132', name: 'someName'}, {id: '456', name: 'someName'}] },
              { name: 'Jack' , sections: [{id: '798', name: 'someName'}] },
              { name: 'Morgan', sections: [{id: '456', name: 'someName'}] },
              { name: 'Billy', sections: [{id: '132', name: 'someName'}, {id: '456', name: 'someName'}]}, 
              { name: 'Monica', sections: [{id: '798', name: 'someName'}] }
          ]
      
      
      
          function filter(directionId) {
               return finalistsCollection.filter((item) =>
                   item.sections.map(section=>section.id).includes(directionId))
          }
          
          console.log(filter('798'))
          console.log(filter('456'))
          console.log(filter('112'))

      【讨论】:

      • 试试filter('456')
      • filter('456') 应该返回一个包含 3 个项目的数组。
      • 对此感到抱歉。我提炼了答案
      猜你喜欢
      • 1970-01-01
      • 2019-05-04
      • 2019-01-17
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      相关资源
      最近更新 更多