Как отфильтровать массив объектов по атрибуту - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть массив объектов следующим образом:

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() после фильтра, но он по-прежнему возвращает весь массив .

Ответы [ 3 ]

0 голосов
/ 13 апреля 2020

Это работает :

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')
0 голосов
/ 13 апреля 2020

Надеюсь, это поможет

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'));
0 голосов
/ 13 апреля 2020

Вы можете использовать небольшой трюк здесь как условие:

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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...