簡體   English   中英

根據另一個對象數組中的條件過濾對象數組

[英]Filter array of objects based on criteria in another array of objects

我想根據otherCategories數組中的條件從categories數組中篩選項目。

如果otherCategories包含對象,其中title匹配從一個標題categories.subCategory[i].titlename匹配categories.subCategory[i].details.name ,則僅過濾來自該對象例如“ITEM1” categories

var categories = [
{
    title:"item1",
    subCategory:[
        {
            title:"subCat1",
            details:{
                name:"detail1",
                email:"test@test.com"
            }
        },
        {
            title:"subCat2",
            details:{
                name:"detail2",
                email:"test@test.com"
            }
        }
    ]
},
{
    title:"item2",
    subCategory:[
        {
            title:"subCat1",
            details:{
                name:"detail3",
                email:"test@test.com"
            }
        },
        {
            title:"subCat2",
            details:{
                name:"detail2",
                email:"test@test.com"
            }
        }
    ]
}
]

var otherCategories = [
{
    title:"subCat1",
    name:"detail1"        
}
]

預期結果

categories = [
{
    title:"item1",
    subCategory:[
        {
            title:"subCat1",
            details:{
                name:"detail1",
                email:"test@test.com"
            }
        },
        {
            title:"subCat2",
            details:{
                name:"detail2",
                email:"test@test.com"
            }
        }
    ]
}]

使用Array.reduceArray.filterArray.some

  • otherCategories數組轉換為標題為鍵,名稱為值的對象
  • 過濾器categories陣列,其中一些subCategory與匹配值存在

 var categories = [{title:"item1",subCategory:[{title:"subCat1",details:{name:"detail1",email:"test@test.com"}},{title:"subCat2",details:{name:"detail2",email:"test@test.com"}}]},{title:"item2",subCategory:[{title:"subCat1",details:{name:"detail3",email:"test@test.com"}},{title:"subCat2",details:{name:"detail2",email:"test@test.com"}}]}]; var otherCategories = [{title:"subCat1",name:"detail1"}]; var obj = otherCategories.reduce((a,c) => Object.assign(a,{[c.title]:c.name}), {}); categories = categories.filter(v => v.subCategory.some(o => obj[o.title] === o.details.name)); console.log(categories); 

通常適用於示例中的簡單對象的另一種方法是,將otherCategories數組轉換為“字符串化”對象的數組,然后通過將所需subCategory鍵值對與“字符串化”版本進行比較來過濾categories 。轉換了otherCategories數組。

但是需要注意的是,JavaScript無法保證對象屬性順序(盡管許多瀏覽器會保留屬性順序)。 這意味着該方法在某些情況下可能不起作用,而@NikhilAggarwal建議的方法則更為穩定。

例如:

 const categories = [{title: "item1", subCategory: [{title: "subCat1", details: {name: "detail1", email: "test@test.com"}},{title: "subCat2", details: {name: "detail2", email: "test@test.com"}}]}, {title: "item2", subCategory: [{title: "subCat1", details: {name: "detail3", email: "test@test.com"}},{title: "subCat2", details: {name: "detail2", email: "test@test.com"}}]}]; const otherCategories = [{title: "subCat1", name: "detail1"}]; let matches = otherCategories.map((item) => JSON.stringify(item)); let results = categories.filter((item) => { for (let sub of item.subCategory) { let match = JSON.stringify({title: sub.title, name: sub.details.name}); if (matches.includes(match)) { return item; } } }); console.log(results); 

您可以通過filtering subCategories將類別map到結果:

  function matches(sub, filters) {
    return filters.some(filter => filter.title === sub.title && filter.name === sub.name);
 }

 const result = categories.map(({ title, subCategories }) => ({ title, subCategories: subCategories.filter(sub => matches(sub, otherCategories)) }));

暫無
暫無

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

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