我很难搞清楚这个问题。我有两个数组(cars
和active_filters
)。 cars数组包含html li标签,其中包含汽车类型,座位数,价格等属性.active_filters数组包含与用户交互的过滤器相关的对象,并将用于显示或隐藏哪些汽车。
示例:在active filters
查看ID data-type
时,value属性包含用户想要显示的所有汽车代码的列表。如果找不到汽车数据类型或等于这些汽车代码中的一个,我的目标是通过向每辆汽车添加等级type
来隐藏这些汽车。因此,在这种情况下,这些汽车应该添加filtered-out-by-car-type
等级。
我注意到我现在拥有的表现非常缓慢。此外,我仍然坚持如何从与找到的汽车相关联的active_filters访问特定的type
。感谢任何帮助!非常感谢!!
汽车:
<li data-partner-code="EZ" data-type="XXAR" data-seats="2" data-bags="2" data-prepaid="Y" data-transmission="Automatic" data-unlimited-miles="Y" data-price="84.81" class="listing">
<li data-partner-code="AV" data-type="SFAR" data-seats="4" data-bags="2" data-prepaid="N" data-transmission="Automatic" data-unlimited-miles="Y" data-price="125.54" class="listing">
<li data-partner-code="BU" data-type="CCAR" data-seats="4" data-bags="2" data-prepaid="N" data-transmission="Automatic" data-unlimited-miles="N" data-price="65.42" class="listing">
<li data-partner-code="BU" data-type="CCAR" data-seats="4" data-bags="2" data-prepaid="N" data-transmission="Automatic" data-unlimited-miles="N" data-price="65.42" class="listing">
<li data-partner-code="FX" data-type="MCAR" data-seats="2" data-bags="1" data-prepaid="N" data-transmission="Automatic" data-unlimited-miles="N" data-price="32.00" class="listing">
有效过滤器:
{id: "data-seats", value: "1", type: "filtered-out-by-seats"}
{id: "data-bags", value: "2", type: "filtered-out-by-bags"}
{id: "data-partner-code", value: "ET,EY,BU", type: "filtered-out-by-company"}
{id: "data-type", value: "IFAR,SFAR,PGAR,RFAR,FFAR,XXAR", type: "filtered-out-by-car-type"}
当前代码:
cars.forEach(function(car)
{
var found = active_filters.find(function(filter) {
var filter_value = filter.value.split(","); // getting unique value
for (var i=0; i<filter_value.length; i++)
{
if (car.attr(filter.id) === filter_value[i])
{
return car; // Why is this returning active_filters element instead of car?
}
}
});
// Todo: How can I access active_filters.type associated to the car that was found?
if (!found)
{
car.addClass(active_filters.type); // ?
}
});
答案 0 :(得分:2)
我的要求对我来说并不完全清楚,但问题似乎是针对基本数组操作量身定制的,所以也许我可以提供一个解决它的框架,你可以填写详细信息。
首先,似乎基本思路是将cars
数组过滤到子集。事实证明,只有那个被调用的方法,filter
const filtered_cars = cars.filter(car => {
// This function will get passed each car in turn. Return
// true if the car should be kept in the list, false otherwise.
});
现在,对于每辆车,我认为您要检查所有有效过滤器。如果任何有效滤波器匹配,则应保留汽车。同样,还有一个Array方法,在这种情况下它是some
。
const filtered_cars = cars.filter(car => {
return active_filters.some(filter => {
// Within this function, we have a car variable, and a filter
// variable. We want to return true if the car matches the
// filter, false otherwise
});
});
从您的描述中可以看出,每个活动过滤器可能有多个 值,以逗号分隔。我们需要将它们提取到一个数组中。我们还可以为过滤器提取适当的汽车属性。
const filtered_cars = cars.filter(car => {
return active_filters.some(filter => {
const values = filter.value.split(",");
const attribute = car.getAttribute(filter.id);
// Return true if the attribute is in the set of values
});
});
我们可以再次使用some
const filtered_cars = cars.filter(car => {
return active_filters.some(filter => {
const values = filter.value.split(",");
const attribute = car.getAttribute(filter.id);
return values.some(value => {
return value === attribute;
});
});
});
此时,我们已将汽车阵列减少到仅与过滤器匹配的元素,但我们还没有将这种类型添加到那些没有制作过滤器的汽车中。为此,我们必须将第一个some
替换为forEach
,以确保我们遍历所有过滤器,而不是在第一次匹配时停止。我们也想要根据需要添加或删除特殊类。
const filtered_cars = cars.filter(car => {
let keep_car = false;
active_filters.forEach(filter => {
const values = filter.value.split(",");
const attribute = car.getAttribute(filter.id);
const matched = values.some(value => {
return value === attribute;
});
car.classList.toggle(filter.type, !matched);
keep_car = keep_car || matched;
});
return keep_car;
});
就像我说的那样,我不确定那段代码是不是你想要的,因为我可能误解了这个问题。但希望它足以让你超越目前的路障。