Tengo una matriz con una matriz anidada de objetos, quiero filtrar los datos donde el objeto de las matrices anidadas cumple varias condiciones.
Aquí están los datos de muestra.
const providerList = [ { id: "bac4ef8d", provider_name: 'Paa Ra' provider_gender: "Male", provider_item: [ { itemID: "5911319b" is_approved: true, is_active: true, }, { itemID: "937a56d7" is_approved: true, is_active: true, }, ], }, { id: "9df373d5", provider_name: "Che Ta", provider_gender: "Female", provider_item: [ { itemID: "5911319b" is_approved: true, is_active: true, } ], } ]
Estos son los filtros, tenga en cuenta que el itemID
puede tener cualquier número de elementos.
const itemFilter = { itemID: ["5911319b", "937a56d7"], is_approved: [true], is_active: [true], };
Aquí está mi código, sin embargo, la salida no regresa como se desea.
const filterProviders = providerList.filter(provider => provider.provider_item.every(item => Object.entries(itemFilter).every(([k, v]) => v.includes(item[k]))), );
Necesito filtrar la lista providerList
y los proveedores que regresan donde provier_item
coincide con todos los valores en itemFilter
. El resultado esperado para el itemFilter
de elemento anterior sería:
filterProviders = [ { id: "bac4ef8d", provider_name: 'Paa Ra' provider_gender: "Male", provider_item: [ { itemID: "5911319b" is_approved: true, is_active: true, }, { itemID: "937a56d7" is_approved: true, is_active: true, }, ], } ]
¿Es esto lo que buscas?:
const providerList = [{ id: "bac4ef8d", provider_name: 'Paa Ra', provider_gender: "Male", provider_item: [{ itemID: "5911319b", is_approved: true, is_active: true, }, { itemID: "937a56d7", is_approved: true, is_active: true, } ] }, { id: "9df373d5", provider_name: "Che Ta", provider_gender: "Female", provider_item: [{ itemID: "5911319b", is_approved: true, is_active: true, }], } ] const itemFilter = { itemID: ["937a56d7", "5911319b"], is_approved: [true], is_active: [true], } const filterProviders = providerList.reduce((acc, provider) => { provider.provider_item = provider.provider_item.filter(item => ( itemFilter.itemID.every(ai => provider.provider_item.map(i => i.itemID).includes(ai)) && itemFilter.is_approved.includes(item.is_approved) && itemFilter.is_active.includes(item.is_active) )) let providerCount = provider.provider_item.length if (providerCount > 0 && providerCount === itemFilter.itemID.length) { acc.push(provider) } return acc }, []) console.log(filterProviders)