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