[英]reducing array of objects by filtering array of objects
我的 function 被發送一個 id 數組作為字符串並返回一個對象數組。 它有效,這很棒。 但我確信有一個更優雅的解決方案,我正在遍歷數組,然后 foreach 遍歷第二個數組,如果找到匹配項。 遍歷第三個數組以檢查重復項。
myMethod: state => (argsArray) => {
const myCampaigns = argsArray.reduce((acc, num) => {
state.campaigns.forEach(item => {
if (item.segmentIds.includes(num) && !acc.includes(item)) {
acc.push(item)
}
})
return acc
}, [])
return myCampaigns
}
根據我從您的代碼中了解到的情況,初始值如下所示:
state = {
campaigns: [
{segmentIds:[1,2,3]}, {segmentIds:[4,5,6], ...}
]
}
argsArray = [1, 3, 6]
您的代碼中有兩次迭代,使您的運行時二次......不理想。
您想要的是避免嵌套迭代。 您可以做到這一點的一種方法是創建一個包含所有 segmentId 的變量,從而使查找更容易處理。 還可以嘗試使用 Javascript 的Set 數據類型,因為它具有非常好的查找時間復雜度。
您的問題的可能解決方案:
// store all your segmentIds before your iteration
// and flatten your array
const segmentIds = state.campaigns
.reduce((accumulator, campaign) => {
return campaign.segmentIds.reduce((acc, id) => {
if (acc.has(id)) return acc;
acc.add(id);
return acc;
}, accumulator);
}, new Set());
//
const myCampaigns = argsArray.reduce((acc, num) => {
if (segmentIds.has(num) && !acc.includes(item)) {
acc.push(item);
}
return acc;
}, []);
或者,如果您對雙重減少不滿意,您可以嘗試使用Lodash 的 flatten 方法:
const segmentIds = _.flatten(
state.campaigns.map(campaign => campaign.segmentIds)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.