[英]How to filter a nested array of objects?
我有一個對象數組,我試圖根據給定條件過濾其中的對象。 該數組包含具有company
和products
字段的對象。
過濾器術語是productType: "Timespot"
。
我想獲得只有productType: "Timespot"
的公司及其產品
const dummyData = [
{
companyName: "Company A",
products: [
{
productType: "Variabel pris",
},
],
},
{
companyName: "Company B",
products: [
{
productType: "Fastpris",
},
{
productType: "Fastpris",
},
{
productType: "Fastpris",
},
{
productType: "Timespot",
},
],
},
{
companyName: "Company C",
products: [
{
productType: "Spotpris",
},
{
productType: "Timespot",
},
],
},
];
const expectedResult = [
{
companyName: "Company B",
products: [
{
productType: "Timespot",
},
],
},
{
companyName: "Company C",
products: [
{
productType: "Timespot",
},
],
},
];
我正在嘗試什么:
dummyData.filter(({ products }) => {
products.some(product => product.productType === "Timespot")
});
為了提供更多背景信息,我希望獲得符合給定條件的公司及其產品。
我認為你的方法的主要問題是過濾器 function 只會過濾第一個數組而不是嵌套的數組,為了做你想做的事,我會使用reduce()
例如
dummyData.reduce((acc,cur)=> {
const filteredProducts = cur.products.filter((p)=> p.productType === "Timespot")
if(filteredProducts.length){
acc.push({...cur, products:filteredProducts})
}
return acc
}, [])
我可能會做這樣的事情:
function filterProductType(arr, prodType) {
return arr.filter(obj => obj.products.some(type => type.productType === prodType));
}
console.log(filterProductType(dummyData, "Timespot"));
回報:
0: companyName: "Company B"
products: Array(4)
0: {productType: 'Fastpris'}
1: {productType: 'Fastpris'}
2: {productType: 'Fastpris'}
3: {productType: 'Timespot'}
length: 4
1: companyName: "Company C"
products: Array(2)
0: {productType: 'Spotpris'}
1: {productType: 'Timespot'}
length: 2
您可以在主數組上使用array.filter
,並在嵌套的產品數組上使用array.find
。
const dummyData=[{companyName:"Company A",products:[{productType:"Variabel pris"}]},{companyName:"Company B",products:[{productType:"Fastpris"},{productType:"Fastpris"},{productType:"Fastpris"},{productType:"Timespot"}]},{companyName:"Company C",products:[{productType:"Spotpris"},{productType:"Timespot"}]}]; const filtered = dummyData.filter(({products}) => { return products.find(({productType}) => productType === 'Timespot'); }) console.log(filtered)
如果您發現您還需要在其他地方按其他一些productType
進行過濾,您可以制作更通用的 function 來處理這個問題。
const dummyData=[{companyName:"Company A",products:[{productType:"Variabel pris"}]},{companyName:"Company B",products:[{productType:"Fastpris"},{productType:"Fastpris"},{productType:"Fastpris"},{productType:"Timespot"}]},{companyName:"Company C",products:[{productType:"Spotpris"},{productType:"Timespot"}]}]; const companyByProductType = ({data, type}) => { return data.filter(({products}) => { return products.find(({productType}) => productType === type); }) } console.log(companyByProductType({data: dummyData, type: 'Timespot'}))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.