在Javascript中按多个条件过滤数组

Posted

技术标签:

【中文标题】在Javascript中按多个条件过滤数组【英文标题】:Filtering array by multiple conditions in Javascript 【发布时间】:2020-08-05 19:31:00 【问题描述】:

我有一个对应于 html 元素的对象数组。这些是应该根据条件是否满足而出现/消失的卡片。我已将 HTMLCollection 转换为 javascript 数组,因此我可以在其上使用数组方法。

我还使用 HTML 选择标签来生成一个 javascript 对象以用作过滤器。我需要知道如何通过对象上的所有键/值对来过滤我的数组。现在我的代码只满足一个条件,最近的条件。

这是 HTML:

<label for="numProperties"></label>
<label for="location"></label>
<label for="retired"></label>

<select class="filter" id="numProperties" onchange="updateFilters(this.value)">
    <option value="none" selected disabled hidden>Choose Num Properties</option>
    <option value="all">All</option>
    <option value="0">0</option>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>

<select class="filter" id="location" onchange="updateFilters(this.value)">
    <option value="none" selected disabled hidden>Choose Location</option>
    <option value="all">All Locations</option>
    <option value="New York">New York</option>
    <option value="New Jersey">New Jersey</option>
    <option value="Connecticut">Connecticut</option>
</select>

<select class="filter" id="retired" onchange="updateFilters(this.value)">
    <option value="none" selected disabled hidden>Choose If Retired</option>
    <option value="true">Yes</option>
    <option value="false">No</option>
</select>

这是我的 javascript:

        function updateFilters(value) 
        var filters = document.getElementsByClassName('filter');
        var activeFilters = ;

        for (var i = filters.length - 1; i >= 0; i--) 
            if (filters[i].value != 'none' && filters[i].value != 'all') 
                activeFilters[filters[i].id] = filters[i].value;
            
        

            filterCards(activeFilters)
        

        function filterCards(activeFilters) 
        var test = allCards.filter(function (card) 
            for (var key in activeFilters) 
                if (card.attributes[key].value === activeFilters[key]) 
                   card.style.display = 'inline-block' 
                 else 
                   card.style.display = 'none'
                
            
        )
    

如您所见,我需要能够过滤任何/所有条件。在纽约拥有 2 处房产且已退休的人。现在我的过滤器只适用于最近的搜索。例如,如果我选择一个新位置,我的数组将显示该新位置中的所有内容,即使该数组中的对象具有不同数量的属性或不同的“已退休”布尔值。

【问题讨论】:

所以如果card匹配所有的过滤器,你设置display为'none',否则'inline-block'? 对不起,我的错误,应该是相反的。我现在已经编辑了。 【参考方案1】:

当过滤器不匹配时,您需要在 for 循环中添加一个“中断”:

for (var key in activeFilters) 
  if (card.attributes[key].value === activeFilters[key]) 
    card.style.display = 'inline-block' 
   else 
    card.style.display = 'none'
    break; // stop filtering this card
    

【讨论】:

以上是关于在Javascript中按多个条件过滤数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flask SQLAlchemy 中按多个条件进行过滤?

javascript过滤数组多个条件

javascript 过滤具有多个条件的对象数组。

在 linq 查询中按条件过滤

通过在嵌套的对象数组中查找多个条件来过滤数组

javascript 根据选择条件过滤数组对象。