具有另一个数组的筛选器的JavaScript筛选器数组

具有另一个数组的筛选器的JavaScript筛选器数组,javascript,arrays,filter,Javascript,Arrays,Filter,我目前正试图通过存储在另一个数组中的多个筛选器筛选一个数组。 筛选器对象包含要筛选的属性的名称、运算符和条件。 所以它可能看起来像这样: let过滤器=[{ 属性:“id”, 接线员:'{ filters.forEach((filter)=>{ 开关(过滤器操作员){ 案例“=”: 如果(!(项[filter.attribute]>=filter.condition))返回false 打破 大小写“*通配符*”: 如果(!项[filter.attribute]。包括(filter.conditi

我目前正试图通过存储在另一个数组中的多个筛选器筛选一个数组。 筛选器对象包含要筛选的属性的名称、运算符和条件。 所以它可能看起来像这样:

let过滤器=[{
属性:“id”,
接线员:'{
filters.forEach((filter)=>{
开关(过滤器操作员){
案例“=”:
如果(!(项[filter.attribute]>=filter.condition))返回false
打破
大小写“*通配符*”:
如果(!项[filter.attribute]。包括(filter.condition))
返回错误
打破
}
})
返回真值
})

提前感谢!:)

您需要根据过滤器从过滤器回调返回布尔值。现在,您总是从传递给过滤器的回调函数返回
true

试着这样做:

constdoesitempassfilter=item=>filter=>{
//你的过滤逻辑
}
items.filter(item=>filters.every(doesItemPassFilter(item));

我的概念是,你的过滤器是“和”-这意味着一个项目必须匹配所有的过滤器。如果你的过滤器是“或”'s-意味着一个项必须至少匹配一个筛选器-然后只需将
every
更改为
some
,您需要从基于筛选器的筛选器回调返回布尔值。现在,您总是从传递给筛选器的回调函数返回
true

试着这样做:

constdoesitempassfilter=item=>filter=>{
//你的过滤逻辑
}
items.filter(item=>filters.every(doesItemPassFilter(item));

我的概念是,你的过滤器是“和”,这意味着一个项目必须匹配所有过滤器。如果你的过滤器是“或”,这意味着一个项目必须至少匹配一个过滤器,那么只需将
every
更改为
some

你的主要问题是没有使用
forEach
回调函数返回值

听起来您想要的是在
过滤器上为
项目中的每个项目使用
数组


const filters=[{“attribute”:“id”,“operator”:“您的主要问题是没有使用
forEach
回调函数返回值

听起来您想要的是在
过滤器上为
项目中的每个项目使用
数组


const过滤器=[{“属性”:“id”,“运算符”:OP对每个否定条件的
返回false
检查表明他们确实需要
评估OP对每个否定条件的
返回false
检查表明他们确实需要
评估非常感谢:)像一个charme!非常感谢:)像一个charme!
items.filter((item) => {
    filters.forEach((filter) => {
      switch (filter.operator) {
        case '<':
          if (!(item[filter.attribute] < filter.condition)) return false
          break
        case '<=':
          if (!(item[filter.attribute] <= filter.condition)) return false
          break
        case '=':
          if (!(item[filter.attribute] === filter.condition)) return false
          break
        case '>':
          if (!(item[filter.attribute] > filter.condition)) return false
          break
        case '>=':
          if (!(item[filter.attribute] >= filter.condition)) return false
          break
        case '*wildcard*':
          if (!item[filter.attribute].includes(filter.condition))
            return false
          break
      }
    })
    return true
  })