[英]Filter an array of objects based on filter criteria in another array of objects: JavaScript
[英]Filter array of objects based on criteria in another array of objects
我想根據otherCategories
數組中的條件從categories
數組中篩選項目。
如果otherCategories
包含對象,其中title
匹配從一個標題categories.subCategory[i].title
和name
匹配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.reduce , Array.filter和Array.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.