簡體   English   中英

通過過濾對象數組來減少對象數組

[英]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.

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