按多个值过滤对象数组

时间:2018-12-02 00:29:42

标签: javascript arrays javascript-objects

我希望能够通过多个搜索字词过滤对象来创建新的对象数组

示例:

  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数组中状态的对象新数组

3 个答案:

答案 0 :(得分:4)

您应该在searchTerms.includes上致电obj.state,而不是相反。这样就变成了:

let result = arr.filter(obj => searchTerms.includes(obj.state));

这意味着过滤筛选出state属性{em>包含在数组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);

答案 1 :(得分: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>

答案 2 :(得分: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)))

相关问题