簡體   English   中英

在循環中鏈接過濾器

[英]Chaining Filters within a Loop

我目前有一個名為場地的數據集合,其中包含以下字段:

const venues = [
{
name: 'test1',
categories: ['1a', '1b'],
currencies: ['2a', '2b']

},
{
name: 'test2',
categories: ['1b'],
currencies: ['2a']

}
]

每個場地對象中的類別/貨幣字段包含它們所屬類別的 ID 以及它們接受的貨幣。

然后我有一個過濾器數組,如下所示:

const filters = [
{
name: 'art',
id: '1a',
type: 'categories'
},
{
name: 'testCurrency',
id: '2b',
type: 'currencies'
},
]

為了鏈接貨幣和類別的過濾器,我正在執行以下操作:

 const filterVenueData = (venues, filterByType, key) => {
    const filteredVenues = venues.filter((venue) => {
      if (!filterByType[key]?.length) return true
      return filterByType[key].some((filters) => {
        return venue[key].includes(filters.id)
      })
    })

    return filteredVenues
  }



  const filtersByType = filters.reduce(
        (hash, obj) => ({
          ...hash,
          [obj['type']]: (hash[obj['type']] || []).concat(obj)
        }),
        {}
      )

const filterByCategory = filterVenueData(
        venues,
        filtersByType,
        'categories'
      )
      const filterByCurrency = filterVenueData(
        filterByCategory,
        filtersByType,
        'currencies'
      )

console.log(filterByCurrency)

雖然這有效......我不禁覺得必須兩次調用該函數(並傳入要過濾的鍵)以鏈接貨幣和類別的過濾器似乎非常低效。 有沒有辦法使用循環來鏈接過濾器,而不是必須調用函數兩次/傳入要過濾的鍵? 我希望過濾器是嚴格的,這意味着在當前示例中,只有屬於藝術類別並接受 testCurrency 的場地才會出現(test1 場地)。

我附上了一個用於調試的代碼沙箱: https : //codesandbox.io/s/serverless-rain-dmluz?file=/ src/ index.js

代替使用filterVenueData對於每種類型的過濾器的,使用filtersByType在其條目對象和迭代-檢查.every其條目中的一個通過了測試(即,場內包含ID中的一個)。

 const venues=[{name:"test1",categories:["1a","1b"],currencies:["2a","2b"]},{name:"test2",categories:["1b"],currencies:["2a"]}],filters=[{name:"art",id:"1a",type:"categories"},{name:"testCurrency",id:"2b",type:"currencies"}]; const filtersByType = {}; for (const { id, type } of filters) { filtersByType[type] ??= []; filtersByType[type].push(id); } const output = venues.filter(obj => Object.entries(filtersByType).every(([key, arr]) => arr.some(id => obj[key].includes(id)) ) ); console.log(output);

暫無
暫無

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

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