通过多个值过滤对象数组

3
我希望能够通过多个搜索条件对一个数组进行筛选,并创建一个新的对象数组。
例子:
  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数组中出现过的状态。


1
你应该在搜索词中搜索状态,而不是反过来。 - Rahim
3个回答

5
你应该在obj.state上调用searchTerms.includes而不是相反。所以代码应该是这样的:
let result = arr.filter(obj => searchTerms.includes(obj.state));

这意味着过滤掉对象中包含在数组“searchItems”中的其“state”属性的对象。
例子:

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);


非常感谢!那个方法起作用了,而且很有道理。可能是太晚了,我的大脑不太灵光哈哈。等系统允许的时候,我会标记你的答案。 - Devon Norris
不客气!我们都有那些时刻哈哈。愉快编码;-) - ibrahim mahrir

1
如果您对使用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>


1

在这里你可以采用另一种方法,利用 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)))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接