簡體   English   中英

如何過濾嵌套的對象數組?

[英]How to filter a nested array of objects?

我有一個對象數組,我試圖根據給定條件過濾其中的對象。 該數組包含具有companyproducts字段的對象。

過濾器術語是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM