按多个字段和条件排序数据

时间:2017-06-06 15:26:50

标签: javascript angularjs angularjs-ng-repeat

我想根据以下条件对数据进行排序:

  1. type排序,优先顺序为[州,市,区]。

    - 类型为state的数据应该位于第一位,然后是带有city的数据,依此类推。

  2. 重复数据应按score排序。

    -eg:如果3行是类型,则按分数排序。

  3. 我的数据对象是:

    $scope.data = [{
     id: 1,
     name: 'ABC',
     type: 'city',
     score: 0.1
    }, {
     id: 2,
     name: 'PQR',
     type: 'city',
     score: 0.7
    }, {
     id: 3,
     name: 'ABC',
     type: 'state',
     score: 0.3
    });
    

    模板是:

    <div ng-repeat="d in data">
     <span>{{d.name}}</span>
     <span>{{d.type}}</span>
     <span>{{d.score}}</span>
    </div>
    

    结果应该是这样的:

    ABC state 0.3
    PQR city 0.7
    ABC city 0.1
    

    Here是plunker的链接。

    我希望按多个字段以及特定的优先级对其进行排序。

    任何帮助将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以在lodash库中找到所需的一切。

以下是文档:https://lodash.com/docs/4.17.4

您的起点是orderBy方法:https://lodash.com/docs/4.17.4#orderBy

解决您的问题:

$scope.data = lodash.orderBy($scope.data, ['type','score'], ['desc', 'desc']);

您可以将ngLodash用于angularjs(使用bower / npm进行简单安装):https://github.com/rockabox/ng-lodash

享受!

答案 1 :(得分:1)

//这是我的代码。我认为这段代码解决了你的问题

  var tempFlag = {'state':1, 'city':2, 'district':3}
  $scope.data=[
    {
     id: 1,
     name: 'ABC',
     type: 'city',
     score: 0.1
    }, {
     id: 2,
     name: 'PQR',
     type: 'city',
     score: 0.7
    }, {
     id: 3,
     name: 'ABC',
     type: 'state',
     score: 0.3
    }
    ].sort(function(a, b) {
        if(a.type == b.type)
           return a.score < b.score;
       return tempFlag[a.type] > tempFlag[b.type];
    });