【问题标题】:Filter array of objects by multiple values按多个值过滤对象数组
【发布时间】:2018-12-02 00:29:41
【问题描述】:

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

例子:

  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 中搜索 state 而不是其他方式。

标签: javascript arrays javascript-objects


【解决方案1】:

您应该在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);

【讨论】:

  • 非常感谢!这行得通,而且有道理,一定为时已晚,我的大脑无法正常工作哈哈。当它让我时,我会标记你的答案
  • 不客气!我们都有这样的时刻哈哈。快乐编码 ;-)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以在此处采用的另一种方法是使用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)))

    【讨论】:

      猜你喜欢
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2020-02-17
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      相关资源
      最近更新 更多