[英]How to filter array of objects with nested arrays based on other 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 並且沒有運氣查看類似問題的許多其他答案。
非常感謝。
由於您需要分別過濾包含size
和tag
數組中的所有sizeArray
和tagArray
的結果。
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
不是超級有效,但我假設您在這里沒有處理大量數據。 如果您的sizeArray
或tagArray
特別大,您可以查看類似Set
object for hash 表效率的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.