【问题标题】:How to efficiently compare an array of objects with another array in JavaScript?如何有效地将一个对象数组与 JavaScript 中的另一个数组进行比较?
【发布时间】:2018-06-07 23:38:59
【问题描述】:

我有一个函数,我必须返回一个带有匹配过滤器的元素数组。函数代码如下:

filter_getCustomFilterItems(filterNameToSearch: string, appliedFilters: Array<any>) {
   let tempFilterArray = [];
   let masterFilterList = getMasterFilterList();
   /*
   filterNameToSearch can be a string either as `Item2` or `Item3`

   masterFilterList will be of type
   masterFilterList: Array<any> = [
   {
      Item1: 'some-item-1',
      Item2: 'some-item-2',
      Item3: 'some-item-3',
      Item4: 'some-item-5',
   },
   {
      Item1: 'some-item-10',
      Item2: 'some-item-11',
      Item3: 'some-item-12',
      Item4: 'some-item-13',
   },......
  ];  

  appliedFilters will be of type
  appliedFilters: Array<any> = [
   {
      name: 'Item1',
      filters: [
          {value: 'some-item-1', status: 'selected'},
          {value: 'some-item-10', status: 'selected'}
      ]
   },......
  ];  
 */

 for (let masterFilterItem of masterFilterList) {
   //Missing logic here
 }
}

我想过滤 masterFilterList 以返回一个项目数组 filterNameToSearch = 'Item2' 在以下条件下:

1) 对于appliedFilters 中的每个数组元素(假设appliedFilterItem),将appliedFilterItem.namemasterFilterItem[appliedFilterItem.name] 进行比较,并检查appliedFilterItem 中的任何过滤器是否与masterFilterItem[appliedFilterItem.name] 具有相同的值

2) 条件必须类似于masterFilterItem[appliedFilterItem[0].name] == appliedFilterItem[0].filters[0].value &amp;&amp; appliedFilterItem[0].filters[0].status === 'selected' &amp;&amp; masterFilterItem[appliedFilterItem[1].name] == appliedFilterItem[1].filters[0].value &amp;&amp; appliedFilterItem[1].filters[0].status === 'selected' and so on for all appliedFilterItems。但是appliedFilters 中的元素数量是动态的。

所以请帮我解决这个问题?

【问题讨论】:

  • 不清楚你需要的输出是什么
  • 输出将是masterFilterList 中的项目数组,并应用了条件。如果给定 filterNameToSearch = "Item2",它必须返回 masterFilters 中的所有 Item2 元素,条件来自 appliedFilters

标签: javascript arrays typescript ecmascript-6


【解决方案1】:
  return masterFilterList.map(el => el[filterNameToSearch])
      .filter(value => 
         appliedFilters.some(({name, filters}) =>
            name === filterNameToSearch &&
            filters.some(filter => 
              filter.status === "selected" &&
              filter.value === value
            )
         )
      );

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 2017-04-27
    • 1970-01-01
    • 2015-05-23
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2022-08-09
    相关资源
    最近更新 更多