简体   繁体   English

ng-repeat中的angularjs自定义过滤器

[英]angularjs custom filter in ng-repeat

I am trying to return unique values from a JSON response via a custom filter. 我试图通过自定义过滤器从JSON响应中返回唯一值。

data: 数据:

[
{
    "SHFUserID": "400",
    "AlertID": "12",
    "TickerID": "4512",
    "Ticker": "GOOG",
    "Active": "1",
    "Status": "2"
},
{
    "SHFUserID": "400",
    "AlertID": null,
    "TickerID": "4512",
    "Ticker": "GOOG",
    "Active": null,
    "Status": null
},
{
    "SHFUserID": "400",
    "AlertID": null,
    "TickerID": "10190",
    "Ticker": "IBM",
    "Active": null,
    "Status": null
}
]

filter: 过滤:

.filter('uniqueTickers', function() {
return function(tickers) {
    var tags = {};
    angular.forEach(tickers, function(obj) {

      if(!(obj.Ticker in tags)){
        tags[obj.Ticker] = {id: obj.TickerID, name:obj.Ticker}

        if(!tags[obj.Ticker].pending){
          tags[obj.Ticker].pending = 0;
        }
        if(!tags[obj.Ticker].settled){
          tags[obj.Ticker].settled = 0;
        }
        if(!tags[obj.Ticker].order){
          tags[obj.Ticker].order = 3;
        }
      }
  if(obj.Status === "1"){
    tags[obj.Ticker].pending = 1;
    if(tags[obj.Ticker].order > 2){
      tags[obj.Ticker].order = 2;
    }
  }
  if(obj.Status === "2"){
    tags[obj.Ticker].settled = 1;
    if(tags[obj.Ticker].order > 1){
      tags[obj.Ticker].order = 1;
    }
  };
    });
return tags;
};

html: 的HTML:

 Search: <input ng-model="query">
  Sort by:
  <select ng-model="orderProp">
    <option value="name">Alphabetical</option>
    <option value="order">Alert Status</option>
  </select>
  <ul class="tickerList">
    <li ng-repeat="ticker in tickers | filter:query | orderBy:orderProp | uniqueTickers">
      <a href="#/ticker/{{ticker.id}}">{{ticker.name}}</a>
      <p>{{ticker}}</p>
    </li>
  </ul>

but the result looks like: 但结果看起来像:

GOOG
{"id":"4512","name":"GOOG","pending":0,"settled":0,"order":3}

IBM
{"id":"10190","name":"IBM","pending":0,"settled":0,"order":3}

instead of: 代替:

GOOG
{"id":"4512","name":"GOOG","pending":0,"settled":1,"order":1}

IBM
{"id":"10190","name":"IBM","pending":0,"settled":0,"order":3}

The goal is to keep the result set unique but set "pending" or "settled" to true if any of the records for that ticker are pending or settled. 目的是保持结果集唯一,但如果该行情记录的任何记录处于待处理或结算状态,则将“ pending”或“ settled”设置为true。

After some discussion, the answer was to avoid overwiting existing data by adding a check around the first section of logic like this: 经过一番讨论,答案是通过在逻辑的第一部分周围添加如下检查来避免过度利用现有数据:

if(!(obj.Ticker in tags)){
    tags[obj.Ticker] = {id: obj.TickerID, name:obj.Ticker};

    if(!tags[obj.Ticker].pending){
      tags[obj.Ticker].pending = 0;
    }
    if(!tags[obj.Ticker].settled){
      tags[obj.Ticker].settled = 0;
    }
    if(!tags[obj.Ticker].order){
      tags[obj.Ticker].order = 3;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM