【问题标题】: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>

【问题讨论】:

    标签: javascript angularjs


    【解决方案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 个对象?
    • 在这种情况下,您将需要第二个列表。仅使用过滤后的元素,并进行少量数学运算:有一页,页数。您可以检查另一个问题:stackoverflow.com/questions/11581209/… 检查小提琴。效果很好!并使用:&lt;li ng-repeat="item in filteredData | startFrom:currentPage*pageSize | limitTo:pageSize"&gt;
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签