Сортировать по значению в паре ng-repeat (key, value) из объекта - PullRequest
0 голосов
/ 16 мая 2018

Я новичок в 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 (я использовал его в другом представлении), но затем я теряю информацию об идентификаторах.Как здесь: https://jsfiddle.net/vmbme3yw/1/

Как мне работать со значением orderBy в AngularJ, где есть пары (ключ, значение)?

1 Ответ

0 голосов
/ 17 мая 2018

Как указано в документации , orderBy ожидает array в качестве ввода, а не объекта.

Таким образом, решение превращает ваш объект в массив.Вы можете сделать это, используя метод reduce, передав функцию callback как 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...