I have this array of objects
[
{
appLearningItemId: 67
catalogues: (2) [ {id: 1041, value: "New Catalog"},
{id: 1058, value: "Test"}]
categories: (3) [{id: 1, value: "Soft Skills"},
{id: 3, value: "Non-technical"},
{id: 5, value: "Induction"}]
code: "CCE0013"
suppliers: (3) [{id: 1, value: "Company XYZ Ltd"},
{id: 2, value: "test c2"},
{id: 17, value: "new company"} ]
title: "07 Values & Beliefs"
type: {id: 11377, value: "Elearning"}
}, ... * 682 items
]
I have to filter this list with 4 different select boxes, Catalogues, Categories, Suppliers, Type.
I can filter the list for type because it is not in an array like so
const typeList = this.originalLearningItems.filter(item => item.type.value === val.typeSearch)
but for catalogues, categories and suppliers they are a level down. I have tried
const listHasCatalogs = this.originalLearningItems.filter(item => item.catalogues.map(
catalogs => catalogs.some(catalog => catalog.value == val.catalogSearch)
but I get catalogs.some is not an object, I also tried catalogs.filter but I get the same error.
What is the best way to filter the items based on values within a nested array of objects?
Advertisement
Answer
.some is a function that belongs to Arrays. You are calling it on each element of the array.
Try this instead.
const listHasCatalogs = this.originalLearningItems
.filter(item =>
item.catalogues.some(catalog => catalog.value == val.catalogSearch)
)