如何根据同一对象内给定的键值过滤对象

Posted

技术标签:

【中文标题】如何根据同一对象内给定的键值过滤对象【英文标题】:How to filter objects based on value of key given inside same object 【发布时间】:2016-10-06 07:10:08 【问题描述】:

我有一个对象列表,我必须根据同一对象中存在的键的值过滤对象,并使用内容创建 <div> 标记。

对象列表:


    "statusCode" : 200,
    "statusMessage" : "OK",
    "result" : [
    
            "owner" : 
                "id" : "3f32ce2f-4300-439b-84bc-92ad46fbccf7"
            ,
            "name" : "Test 12345",
            "description" : "Test 12345",
            "created_at" : 1465222538,
            "active" : "true",
            "id" : "2ade9236-c382-400c-9c0b-94e96db9b2aa",
            "status" : "OPEN"
        , 
            "owner" : 
                "id" : "3f32ce2f-4300-439b-84bc-92ad46fbccf7"
            ,
            "name" : "sample2",
            "description" : "sample2",
            "created_at" : 1465117865,
            "active" : "true",
            "id" : "8bf206f9-d3e0-43f4-ba3f-f71c88db9b0e",
            "status" : "IN PROGRESS"
        , 
    ]

我想根据"status" : "IN PROGRESS""status" : "OPEN" 过滤数据并在<li> 标签内显示数据,但标识符(键)存在于同一个对象内。如何在 angularjs 或 vanilla javascript 中实现这一点?

现在我正在循环使用 ng-repeat 在<li> 中创建和显示数据:

<div>
    <ul>
        <li ng-repeat="wd in currentPageWorkOrders>
            <a ng-click="viewProject(wd)"  href="">
                <h4>wd.name</h4>
            </a>
            <p>Publisher Name</p>
        </li>
    </ul>
</div>

【问题讨论】:

【参考方案1】:

您可以使用filter方法过滤出需要的数据

var _getResult = myArray[0].result;
var filterArray = _getResult.filter(function(item)
 return item.status ==="OPEN" || item.status === "IN PROGRESS"

)
console.log(filterArray)

看到这个jsfiddle

【讨论】:

结果对象与我传​​递的对象有何不同?它打印出相同的对象。我想根据status 键创建&lt;li> 所以如果status == open 我将创建一个&lt;li&gt;object data&lt;/li&gt; 并且如果status==In progress' then another 对象数据` 嗨,一个简单的问题,函数内部的 item 参数来自哪里?我们就这样通过吗?我来自java背景 在将过滤器数组附加到范围后,而不是 currentPageWorkOrders 中的 wd 执行 wd.filterArray。 filterArray 将仅具有您需要的那些状态 item 只是 array.prototype.filter 接受的一个参数,而不是 item 你可以随意命名它【参考方案2】:

您可以使用 ng-if 过滤 items.codepen url 以供参考 http://codepen.io/nagasai/pen/MeaawO

  <li ng-repeat="wd in currentPageWorkOrders.result" ng-if="wd.status == 'OPEN'">
                          <a ng-click="viewProject(wd)"  href="">
                              <h4  >wd</h4>

                          </a>

                      </li>

希望对你有帮助

【讨论】:

嗨,我在侧边栏上有一个名为&lt;button&gt;OPEN&lt;/button&gt;&lt;button&gt;IN PROGRESS&lt;/button&gt; 等的按钮列表。我只想在单击相应按钮时显示上述结果 检查更新的 codepen URL -codepen.io/nagasai/pen/MeaawO。希望这对你有用:)【参考方案3】:

您可以通过 Angular 以更短的方式使用过滤器。 例如您可以在 ng-repeat 中进行过滤。

所以,你的 ng-repeat 将是这样的:

<li ng-repeat="wd in elements | filter:search">
  <a ng-click=" viewProject(wd) " href=" ">
    <h4>wd.name</h4
  </a>
  <p>Status: wd.status</p>
</li>

其中搜索是您设置 fiters 元素的新元素。就我而言,我使用:

<span class="btn btn-default" ng-click="search.status=''">No Filters</span>
<span class="btn btn-primary" ng-click="search.status='OPEN'">Show Open</span>
<span class="btn btn-success" ng-click="search.status='IN PROGRESS'">Show In Progress</span>

您可以在 Plunkr 中查看它的工作原理:https://plnkr.co/edit/5V3Rg0lggjnPVFu3srsG?p=preview

【讨论】:

谢谢你,何塞。我如何提供分页假设我只想在 ng-click 上显示 10 个对象? 在这种情况下,您将需要第二个列表。仅使用过滤后的元素,并进行少量数学运算:有一页,页数。您可以检查另一个问题:***.com/questions/11581209/… 检查小提琴。效果很好!并使用:&lt;li ng-repeat="item in filteredData | startFrom:currentPage*pageSize | limitTo:pageSize"&gt;

以上是关于如何根据同一对象内给定的键值过滤对象的主要内容,如果未能解决你的问题,请参考以下文章

过滤数组对象中的键值,将将键值替换成我们需要的键名及值名

javascript 删除对象内的键值对

无法根据另一个对象数组过滤对象数组

Laravel - 根据键值删除数组内的对象 - array_filter

redis存储的键值最好控制在多少kb内

ES6基础入门教程(九)修改对象的键值