angular.js使用优先级和对象属性值对ng-repeat进行排序

时间:2014-07-29 20:20:22

标签: javascript json angularjs

考虑具有以下数据的JSON对象:

{
   "results": [
      { 
         flags: [
            is_special: true // or false, or non-existing
         ],

         type: "typeone" // or typetwo, or non-existing
      },
      ... // repeats
   ]
}

为订阅结果的ng-repeat="result in json.results"创建过滤器的有效方法是什么:

  1. 将所有is_special=true放在首位,按#2排序,& #3。
  2. 将所有typeone放在typetwo
  3. 之前
  4. 将所有typetwo放在所有其余的(或没有任何标志/类型)之前。
  5. 重要提示:当其中一些属性不存在或等于""时,它不会失败

    由于

2 个答案:

答案 0 :(得分:2)

我不认为这是最好的方法,但有一种方法可以使用Underscore JS。希望有人可以优化我的代码:

// Grab the items that have the flag
first = _.filter(results, function(r)
{
    return r.flags.is_special;
}

// Grab the remainder
remainder = _.where(results, {flags.is_special: false});

// Now grab your second list
second = _.filter(remainder, function(r)
{
    return r.type =='typeone';
});

// Again grab the remainder (and so on)

// Then return your 4 lists

答案 1 :(得分:0)

orderBy接受一系列参数,因此您可以直接进入列表:

ng-repeat="result in json.results | orderBy: [isSpecial, typeFilter]"


$scope.isSpecial = function(item) {
    for (var i = 0; i < item.flags.length; i++) {
       if (item.flags[i]["is_special"])
            return true;
    }
}

$scope.typeFilter = function(item) {
    item.type == "typeone" ? return 1 : return 0;
}