[英]Filter array of objects by multiple values
我希望能夠通過多個搜索詞過濾一個對象來創建新的對象數組
例:
const arr = [
{
'city': 'Atlanta',
'state': 'Georgia'
},
{
'city': 'Chicago',
'state': 'Illinois'
},
{
'city': 'Miami',
'state': 'Florida'
}
]
const searchTerms = ['Georgia', 'Florida']
我希望能夠像這樣過濾它:
arr.filter(obj => obj['state'].includes(searchTerms))
我發現使用.includes輸入一個字符串是可行的,但不能使用數組。 我願意接受不同的邏輯,甚至可以接受lodash之類的第三方庫。 我想返回一個僅包含searchterms數組中狀態的對象新數組
你應該叫searchTerms.includes
上obj.state
,而不是周圍的其他方式。 這樣就變成了:
let result = arr.filter(obj => searchTerms.includes(obj.state));
這意味着篩選出具有state
屬性包含在數組searchItems
中的searchItems
。
例:
const arr = [{'city': 'Atlanta', 'state': 'Georgia'}, {'city': 'Chicago', 'state': 'Illinois'}, {'city': 'Miami', 'state': 'Florida'}]; const searchTerms = ['Georgia', 'Florida']; let result = arr.filter(obj => searchTerms.includes(obj.state)); console.log(result);
如果您對使用Ramda的解決方案感興趣:
const cities = [ { 'city': 'Atlanta', 'state': 'Georgia' }, { 'city': 'Chicago', 'state': 'Illinois' }, { 'city': 'Miami', 'state': 'Florida' } ]; const findCities = (search, cities) => { const predicate = R.flip(R.includes)(search); return R.filter(R.compose(predicate, R.prop('state')), cities); }; console.log( findCities(['Georgia', 'Florida'], cities) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
您可以在此處采取的另一種方法是利用Map
,該Map
檢索時間將保持一致:
const arr = [ { 'city': 'Atlanta', 'state': 'Georgia' }, { 'city': 'Chicago', 'state': 'Illinois' }, { 'city': 'Miami', 'state': 'Florida' } ] const searchTerms = ['Georgia', 'Florida'] const searchMap = arr.reduce((r,c) => (r.set(c.state, c),r), new Map()) console.log(searchTerms.map(x => searchMap.get(x)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.