У меня есть объект, который выглядит как:

{
   3019: 'Javascript',
   3046: 'Css'
}

И затем я показываю этот объект в виде select:

<select
    ng-model="langChoosed"
    ng-options="key as value for (key, value) in progLanguages"
></select>

Мне нужно отсортировать элементы внутри выделения, но фильтр orderBy, похоже, работает только с массивами, как я могу заставить его работать с объектами?

1
Pablo 12 Янв 2017 в 19:49

3 ответа

Лучший ответ

Порядок NO не может быть применен к простому объекту, в качестве альтернативы вы можете определить метод в контроллере для преобразования объекта в массив

< Сильный > DEMO

var app = angular.module('todoApp', []);

app.controller("dobController", ["$scope",
  function($scope) {
    $scope.progLanguages = {
      3019: 'Javascript',
      3046: 'Css'
    };
    $scope.templatesAry = function() {
      var ary = [];
      angular.forEach($scope.progLanguages, function(val, key) {
        ary.push({
          id: key,
          lang: val
        });
      });
      return ary;
    };
  }

]);
<!DOCTYPE html>
<html ng-app="todoApp">

<head>
  <title>To Do List</title>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js"></script>

</head>


<body ng-controller="dobController">
  <select class="form-control" id="selection" ng-model="currentSelected" ng-options="selection.id as selection.lang for selection in templatesAry()  | orderBy:'lang'"></select>
</body>

</html>
4
Sajeetharan 12 Янв 2017 в 17:04

Что-то вроде этого хорошо для вас?

  var myObj = {
      3046:'Css',
    3019:'Javascript'
  };
  var keys = [];

angular.forEach(myObj, function(value,key){
    keys.push(key);
});

keys.sort();

$scope.myObj2={};
angular.forEach(keys, function(key){
    $scope.myObj2[key]=myObj[key];
});

И ваш HTML

<select
    ng-model="langChoosed"
    ng-options="key as value for (key, value) in myObj2"
></select>
-1
Francesca 12 Янв 2017 в 16:58

Ключи объектов неупорядочены - поэтому вы не можете их отсортировать. Преобразовать ваш объект в массив, отсортировать его, а затем использовать его:

var sortedArrayFromObject = Object.keys($scope.progLanguages).map(function(key) {
    var obj = {};
    obj["key"] = key;
    obj["value"] = $scope.propLanguages[key];

    return obj;
});

//Sort it
sortedArrayFromObject.sort(function(a, b) {
    return +a.key - +b.key; //since all keys are strings - do an int cast with "+"
});

//Assign it
$scope.sortedArray = sortedArrayFromObject;

Используй это:

<select
ng-model="langChoosed"
ng-options="item.key as item.value for item in sortedArray"></select>
1
tymeJV 12 Янв 2017 в 16:58