【问题标题】:Sort by value in ng-repeat (key, value) pair from object按对象中的 ng-repeat (key, value) 对中的值排序
【发布时间】:2018-10-27 00:49:38
【问题描述】:

我是 AngularJS 的新手。使用 API,我得到了运动的键值对

$scope.sports = { 1: "Soccer", 2: "Tennis", 3: "Basketball" ... };

是否可以按运动名称对项目进行排序:

<ul>
  <li ng-repeat="(id, value) in sports | orderBy:'value'">
      <a ng-href='/page/{{id}}'>{{value}}</a>
  </li>
 </ul>

这根本不起作用

https://jsfiddle.net/ak657soa/1/

 now is
--------------------
    Soccer // id: 1
    Tennis // id: 2
    Basketball // id: 3
    MMA // id: 4
    Street dance // id: 5
    Aerobics // id: 6
    Aerial hoop // id: 7

should be
    --------------------
    Aerial hoop // id: 7
    Aerobics // id: 6
    Basketball // id: 3
    MMA // id: 4
    Soccer // id: 1
    Street dance // id: 5
    Tennis // id: 2

我尝试使用 underscore.js 在控制器内对它们进行排序(我在不同的视图中使用它)但随后我丢失了有关 id 的信息。喜欢这里:https://jsfiddle.net/vmbme3yw/1/

如何处理 AngularJs 中的 orderBy 值,其中 (key, value) 对?

【问题讨论】:

    标签: javascript angularjs sorting


    【解决方案1】:

    正如the documentation 所说,orderBy 期望 array 作为输入,而不是对象。

    因此,解决方案是将您的对象转换为数组。您可以使用reduce 方法通过将回调 函数作为argument 传递来执行此操作。

    $scope.sports = Object.keys($scope.sports).reduce(function(arr,key){
        arr.push({id: key, value: $scope.sports[key]})
        return arr;
    },[]);
    

    另外,您可以使用map 方法。

    $scope.sports = Object.keys($scope.sports).map((key) => ({id: key, value: $scope.sports[key]}));
    

    现在您可以显示按value 字段订购的商品。

    <li ng-repeat="elem in sports | orderBy:'value'">
         <a ng-href='/page/{{elem.id }}'>{{elem.value}}</a> // id: {{id}}
    </li>
    

    工作解决方案:

    var app = angular.module('myApp', []);
    app.controller('myCtrl', function($scope) {
        $scope.sports = { 1: "Soccer", 2: "Tennis", 3: "Basketball", 4: "MMA", 5: "Street dance", 6: "Aerobics", 7: "Aerial hoop" };
        $scope.sports = Object.keys($scope.sports).map((key) => ({id: key, value: $scope.sports[key]}));
     });
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-controller="myCtrl" ng-app="myApp">
        <ul>
          <li ng-repeat="elem in sports | orderBy:'value'">
           <a ng-href='/page/{{elem.id }}'>{{elem.value}}</a> // id: {{elem.id}}
          </li>
        </ul>
    </div>

    【讨论】:

    • 如果使用map而不是reduce,代码将更具可读性。
    • 感谢您的回答不仅是一个解决方案,而且写得很好理解:D
    猜你喜欢
    • 2021-02-24
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2016-04-26
    • 2012-07-23
    相关资源
    最近更新 更多