簡體   English   中英

如何根據其他 arrays 對象的嵌套 arrays 過濾對象數組

[英]How to filter array of objects with nested arrays of objects based on other arrays

示例代碼。

const cards = [
    {
        id: "1",
        name: "J",
        tag: [
          {
            "colour": "red"
          },
          {
            "colour": "yello"
          },
          {
            "colour": "blue"
          },
          {
            "colour": "white"
          },
        ],
        size: [
          {
            "name": "small"
          },
          {
            "name": "medium"
          },
        ],
    },
    {
        id: "2",
        name: "S",
        tag: [
          {
            "colour": "red"
          },
          {
            "colour": "green"
          },
          {
            "colour": "black"
          },
        ],
        size: [
          {
            "name": "small"
          },
          {
            "name": "medium"
          },
        ],
    },
    {
        id: "3",
        name: "K",
        tag: [
          {
            "colour": "green"
          },
          {
            "colour": "purple"
          },
          {
            "colour": "brown"
          },
          {
            "colour": "white"
          },
        ],
        size: [
          {
            "name": "large"
          },
        ],
    }
];

測試 arrays

const sizeArray = ["medium", "small"];
const tagArray = ["red", "black"];

在此示例中,我希望過濾后的對象數組僅包含第二個 object。 只過濾那些符合所有條件的人,給我留下一個新的對象數組。

我已經嘗試過使用 .filter、.some、.includes 並且沒有運氣查看類似問題的許多其他答案。

非常感謝。

您可以將過濾器everysome一起使用。

由於您需要分別過濾包含sizetag數組中的所有sizeArraytagArray的結果。

 const cards = [ { id: "1", name: "J", tag: [ { colour: "red", }, { colour: "yello", }, { colour: "blue", }, { colour: "white", }, ], size: [ { name: "small", }, { name: "medium", }, ], }, { id: "2", name: "S", tag: [ { colour: "red", }, { colour: "green", }, { colour: "black", }, ], size: [ { name: "small", }, { name: "medium", }, ], }, { id: "3", name: "K", tag: [ { colour: "green", }, { colour: "purple", }, { colour: "brown", }, { colour: "white", }, ], size: [ { name: "large", }, ], }, ]; const sizeArray = ["medium", "small"]; const tagArray = ["red", "black"]; const result = cards.filter(({ tag, size }) => sizeArray.every((s) => size.some((si) => si.name === s)) && tagArray.every((t) => tag.some((ta) => ta.colour === t)) ); console.log(result);

filter主數組時,您要確保至少一個tag值在tagArray中,並且至少一個size值在sizeArray中。 這可以使用includes來實現。

 const cards=[{id:"1",name:"J",tag:[{colour:"red"},{colour:"yello"},{colour:"blue"},{colour:"white"}],size:[{name:"small"},{name:"medium"}]},{id:"2",name:"S",tag:[{colour:"red"},{colour:"green"},{colour:"black"}],size:[{name:"small"},{name:"medium"}]},{id:"3",name:"K",tag:[{colour:"green"},{colour:"purple"},{colour:"brown"},{colour:"white"}],size:[{name:"large"}]}]; const sizeArray = ["medium", "small"]; const tagArray = ["red", "black"]; const filtered = cards.filter((card) => { return ( card.tag.some((tag) => tagArray.includes(tag.colour)) && card.size.some((size) => sizeArray.includes(size.name)) ); }); console.log(filtered);

請注意, includes不是超級有效,但我假設您在這里沒有處理大量數據。 如果您的sizeArraytagArray特別大,您可以查看類似Set object for hash 表效率的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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