0

I've got an array of objects as follows:

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'}] }
]

How to filter this array by id value? For now, I've made filtering if a sections array has only one object inside:

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

I've tried to use map() function after the filter, but it still returns the whole array.

Kate Orlova
  • 3,225
  • 5
  • 11
  • 35
Oleg Shchegolev
  • 176
  • 1
  • 11
  • Does this answer your question? [How to filter object array based on attributes?](https://stackoverflow.com/questions/2722159/how-to-filter-object-array-based-on-attributes) – HMD Apr 13 '20 at 15:08

3 Answers3

0

This 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')
twharmon
  • 4,153
  • 5
  • 22
  • 48
0

Hope this helps

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'));
Nafis Islam
  • 1,483
  • 1
  • 14
  • 34
-1

You can use a small trick here as the condition:

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'))
Nilanka Manoj
  • 3,527
  • 4
  • 17
  • 48