AngularJs在ngRepeat中排序对象

ras*_*cio 14 angularjs angularjs-ng-repeat

我正在使用AngularJs,并在模板中对哈希对象的属性进行排序时遇到了问题.
我的目标是:

function TestCtrl($scope){
    $scope.week = {'MONDAY': ['manuel'], 'TUESDAY': [], 'WEDNESDAY': ['valerio'], 'THURSDAY': ['manuel', 'valerio'], 'FRIDAY': []}
}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试在模板中打印这些值时:

<div ng-repeat="(day, names) in week">
    <span>{{day}}</span>
    <ul> <li ng-repeat="name in names">{{name}}</li> </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

印刷日期的顺序不同: FRIDAY MONDAY THURSDAY TUESDAY WEDNESDAY

我试图应用过滤器,orderBy但我认为它不适用于对象,但只是与数组...

我怎么订购?

Alw*_*ner 20

根据AngularJS docs(版本1.3.20):

您需要知道JavaScript规范没有定义它将返回对象键的顺序.为了确保密钥的确定性顺序,Angular版本(包括1.3)按字母顺序对密钥进行排序.

解决方法是使用一组键:

function TestCtrl($scope){
    $scope.week = {
        'MONDAY': ['manuel'], 'TUESDAY': [], 
        'WEDNESDAY': ['valerio'], 'THURSDAY': ['manuel', 'valerio'],    
        'FRIDAY': []}

    $scope.weekDays = ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"];
}
Run Code Online (Sandbox Code Playgroud)

在视图中使用数组进行迭代:

<div ng-repeat="day in weekDays">
    <span>{{day}}</span>
    <ul> <li ng-repeat="name in week[day]">{{name}}</li> </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

从AngularJS 1.4.6版文档更新:

版本1.4删除了字母排序.我们现在依赖浏览器在运行时返回的顺序for key in myObj.

  • "JS对象键默认按字母顺序排序":这不是真的.AngularJS的排序:https://github.com/angular/angular.js/blob/master/src/ng/directive/ngRepeat.js#L345 (4认同)
  • 对此,@ MArc,还有很多争论试图删除这个'功能':https://github.com/angular/angular.js/issues/6210 (2认同)
  • 从1.4开始,键不再按字母顺序排序.这在此处记录为一个重大变化:https://github.com/angular/angular.js/blob/master/CHANGELOG.md#breaking-changes-6 (2认同)

Sha*_*man 6

没有办法像这样订购哈希对象.不仅仅是角度,而是一般的javascript.

我会将哈希对象转换为对象数组,类似于:

$scope.week = [{day: 'MONDAY', names: ['manuel']}, {day: 'TUESDAY', names: []} ...];
Run Code Online (Sandbox Code Playgroud)

然后将视图更改为:

<div ng-repeat="day in week|orderBy:'day'">
    <span>{{day.day}}</span>
    <ul> <li ng-repeat="name in day.names">{{name}}</li> </ul>
</div>
Run Code Online (Sandbox Code Playgroud)