如何一次为多个过滤器创建 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)
文档
我的问题:
我有一个网站,我可以在其中比较存储在数组(与对象)中的产品。我想从一个对象内部的数组中添加不同的过滤器,这些过滤器会一起应用。
对于两个过滤器,我可以轻松做到(请参阅下面的代码)。我只是比较两个对象并根据它们的内容使用过滤器。
但是如果有两个以上的对象,使用过滤器的好方法是什么。我可以遍历对象并比较数组是否为空吗?
使用我目前的方法,我必须为每个新过滤器扩展我的代码,它会膨胀。
我想做什么:
我想检查哪些过滤器对象在其“特征”数组中有任何数据(该数组在用户单击网站上的过滤器后被填充),如果有,我想使用这些数组来过滤主要内容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)