簡體   English   中英

按多個值過濾對象數組

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

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