【问题标题】:Array.prototype.filter - Is it possible to filter multiple conditions with more than one criteria? [JS, VueJS]Array.prototype.filter - 是否可以使用多个条件过滤多个条件? [JS,VueJS]
【发布时间】:2020-05-15 14:42:03
【问题描述】:

我在 VueJS 2.0/Nuxt 应用程序上有以下方法:

applyFilters(filterCriteria) {
  this.filtered = this.unfiltered.slice().filter((x) => {
    // Zona
    if (x.zona !== filterCriteria.zona) {
      return false
    }

    // Bairro
    for (const key in filterCriteria.bairro) {
      if (x.bairro !== filterCriteria.bairro[key]) {
        return false
      }
    }

    // Categoria
    for (const key in filterCriteria.categoria) {
      if (x.categoria !== filterCriteria.categoria[key]) {
        return false
      }
    }
    return true
  })
},

我想要实现的是以某种方式也基于多个条件过滤多个条件。 .filter() 可以实现吗?

每当我应用第一个标准时,它都可以正常工作,并且当我应用第二个标准时,它也可以正常工作,但是每当我将第二个项目应用于第二个标准时,它每次都无法过滤并回退到 false .

这行得通:

  filterCriteria: {
    zona: 'Germany',
    bairro: ['Berlin'],
    categoria: ['City']
  }

这不会:

  filterCriteria: {
    zona: 'Germany',
    bairro: ['Berlin', 'Munich'],
    categoria: ['City']
  }

是我遗漏了什么还是无法按预期工作?

【问题讨论】:

  • 不清楚您对第二个过滤器的期望。按照你的方式,如果有任何 匹配,它将返回 false。那是你要的吗?或者,如果任何一个匹配匹配,您是否希望它返回 true?
  • @MarkMeyer 抱歉不清楚。预期的行为是过滤bairro: 'Berlin', 'Munich'] 中的任何条件,而不是每个条件。

标签: javascript arrays vue.js ecmascript-6 nuxt.js


【解决方案1】:

您可以使用包含()。数组和字符串包含这个方法

applyFilters(filterCriteria) {
    this.filtered = this.unfiltered.slice().filter((x) => {
        // Zona
        if (x.zona !== filterCriteria.zona) {
           return false
        }

        // Bairro
        if (!filterCriteria.bairro.includes(x.bairro)) {
           return false
        }

        // Categoria
        if (!filterCriteria.categoria.includes(x.categoria)) {
           return false
        }

        return true
    })
},

【讨论】:

  • 不会迭代多个。
【解决方案2】:

原因是

for (const key in filterCriteria.bairro) {
  if (x.bairro !== filterCriteria.bairro[key]) {
    return false
  }
}

一个值不能等于两个不同的值。

也就是说,你不能有一个值等于'Berlin',然后也等于'Munich'。所以它肯定会失败。看起来第三次检查也会有同样的问题。

你可以使用includes,或者其他方式是

if (!filterCriteria.bairro.some(v => v === x.bairro))
  return false;

请注意:如果您有一个大数组,您可以使用Set 来代替,以便快速检查。就像myCities.has(thisCity)O(1) 时间。

【讨论】:

  • 如何在 for 循环中测试多个值,同时考虑之前应用的标准?
  • Eugene 对包含有一个很好的答案——在这里使用它是一个很好的选择。
  • 感谢您的详细回答。我已经尝试过includessome 并且它按预期工作。不敢相信解决方案这么简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2021-09-01
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多