如何一次为多个过滤器创建 JavaScript 过滤器函数

How can I create a JavaScript filter function for multiple filters at once

我的问题:

我有一个网站,我可以在其中比较存储在数组(与对象)中的产品。我想从一个对象内部的数组中添加不同的过滤器,这些过滤器会一起应用。

对于两个过滤器,我可以轻松做到(请参阅下面的代码)。我只是比较两个对象并根据它们的内容使用过滤器。

但是如果有两个以上的对象,使用过滤器的好方法是什么。我可以遍历对象并比较数组是否为空吗?

使用我目前的方法,我必须为每个新过滤器扩展我的代码,它会膨胀。

我想做什么:

我想检查哪些过滤器对象在其“特征”数组中有任何数据(该数组在用户单击网站上的过滤器后被填充),如果有,我想使用这些数组来过滤主要内容filteredArray 数组。

我当前的对象:

features_collection: {
    aspect_ratio_object: {
      features: [],
      value: "Aspect Ratio",
    },
    performance_rating_object: {
      features: [],
      value: "Performance Rating",
    },
  },

我的过滤功能:

    if (
      features_collection.aspect_ratio_object.features.length &&
      features_collection.performance_rating_object.features.length
    ) {
      return filteredArray.filter(
        (obj) =>
          features_collection.aspect_ratio_object.features.includes(
            obj[features_collection.aspect_ratio_object.value]
          ) &&
          features_collection.performance_rating_object.features.includes(
            obj[features_collection.performance_rating_object.value]
          )
      );
    } else if (
      features_collection.aspect_ratio_object.features.length ||
      features_collection.performance_rating_object.features.length
    ) {
      return filteredArray.filter(
        (obj) =>
          features_collection.aspect_ratio_object.features.includes(
            obj[features_collection.aspect_ratio_object.value]
          ) ||
          features_collection.performance_rating_object.features.includes(
            obj[features_collection.performance_rating_object.value]
          )
      );
    }
  },

进一步说明:

我也可以改变我的对象。我可以将其更改为一个对象数组,这样可以使事情变得更容易吗?

你显然循环遍历了你的对象。

这是 features_collection 的循环代码:

features_collection.forEach(function (item, index) {
  console.log(item, index);
});

将过滤器设置为 array 似乎更实用。这是一个关于如何做的例子 根据您的 feature_collection.

过滤一组对象
function filter_by_features(targets, feature_collection) {
    
    // Start right of to filter the `filteredArray`
    return targets.filter(obj => {

        // go through every feature and test it against the current object.
        // every() returns either true or false and the targets array is filtered 
        // by that condition supplied within the callback of `every()`
        return feature_collection.every(filter => {

            // If for a given feature no filter is available, return true
            // so the test for this filter passes.
            if(filter.features.length === 0) {
                return true
            }

            // there are features, check if any applies.
            return filter.features.includes(obj[filter.value])
    
        })

    })

}

用法

// feature collection  (as array)
const feature_collection = [
    {
        features: [],
        value: "Aspect Ratio",
    },
    {
        features: [],
        value: "Performance Rating",
    }
]

// the objects you want to filter.
const objects_to_filter = [/* ... */]

const filtered = filter_by_features(objects_to_filter, feature_collection)

文档