角度ng-repeat反向

Del*_*emm 221 javascript arrays reverse angularjs angularjs-ng-repeat

如何在角度中获得反转阵列?我正在尝试使用orderBy过滤器,但它需要一个谓词(例如'name')来排序:

<tr ng-repeat="friend in friends | orderBy:'name':true">
      <td>{{friend.name}}</td>
      <td>{{friend.phone}}</td>
      <td>{{friend.age}}</td>
<tr>
Run Code Online (Sandbox Code Playgroud)

有没有办法反转原始数组,没有排序.像那样:

<tr ng-repeat="friend in friends | orderBy:'':true">
      <td>{{friend.name}}</td>
      <td>{{friend.phone}}</td>
      <td>{{friend.age}}</td>
<tr>
Run Code Online (Sandbox Code Playgroud)

Jay*_*com 327

我建议使用这样的自定义过滤器:

app.filter('reverse', function() {
  return function(items) {
    return items.slice().reverse();
  };
});
Run Code Online (Sandbox Code Playgroud)

然后可以使用它,如:

<div ng-repeat="friend in friends | reverse">{{friend.name}}</div>
Run Code Online (Sandbox Code Playgroud)

看到它在这里工作:Plunker演示


可根据您的需要定制此过滤器以满足您的需求.我在演示中提供了其他示例.一些选项包括在执行反向之前检查变量是否为数组,或者使其更宽松以允许反转更多事物(如字符串).

  • 太好了!请注意`items.reverse()`修改数组而不是仅创建一个新数组并返回它. (20认同)
  • 谢谢!我忽略了这一点.我扔了一个[`slice()`](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/slice)来解决这个问题. (12认同)
  • 您应该添加`if(!angular.isArray(items))return false;`以在尝试反转之前验证您是否有数组. (9认同)
  • 需要更加防御null,应该使用以下代码:返回项目?items.slice().reverse():[]; (6认同)
  • @Chris Yeung:不建议在null时返回空"[]".最好返回原始值. (5认同)

ami*_*kle 196

这是我用过的:

<alert ng-repeat="alert in alerts.slice().reverse()" type="alert.type" close="alerts.splice(index, 1)">{{$index + 1}}: {{alert.msg}}</alert>
Run Code Online (Sandbox Code Playgroud)

更新:

对于旧版本的Angular,我的回答是可以的.现在,你应该使用

ng-repeat="friend in friends | orderBy:'-'"

要么

ng-repeat="friend in friends | orderBy:'+':true"
Run Code Online (Sandbox Code Playgroud)

来自/sf/answers/1864499591/


Dmi*_*har 124

很抱歉在一年后提出这个问题,但有一个新的,更简单的解决方案,适用于Angular v1.3.0-rc.5及更高版本.

文档中提到:"如果没有提供属性,(例如'+'),则数组元素本身用于比较排序".所以,解决方案将是:

ng-repeat="friend in friends | orderBy:'-'" 要么

ng-repeat="friend in friends | orderBy:'+':true"

这个解决方案似乎更好,因为它不会修改数组,也不需要额外的计算资源(至少在我们的代码中).我已经阅读了所有现有的答案,仍然喜欢这个答案.

  • @Cody抱歉迟到了.在这里 - 一个角度为v1.3.5的工作示例https://jsfiddle.net/dmitry_gonchar/L98foxhm/1/.可能问题出在另一个地方. (2认同)

小智 52

您可以通过$ index参数进行反转

<tr ng-repeat="friend in friends | orderBy:'$index':true">
Run Code Online (Sandbox Code Playgroud)

  • 应该工作,但没有(尝试使用和$ quot index周围的引号).我在使用Angular 1.1.5. (13认同)
  • 不适用于AngularJS 1.2.13.我修改了我的对象数组,为每个对象添加一个id.id是数组内对象的索引.然后`ng-repeat ="朋友在朋友中| orderBy:'id':true"`有效. (4认同)
  • 为我工作(虽然使用财产进行排序而不是$ index)http://stackoverflow.com/questions/16261348/descending-order-by-date-filter-in-angularjs#answer-16261373 (2认同)

小智 44

简单的解决方案: - (无需制作任何方法)

ng-repeat = "friend in friends | orderBy: reverse:true"
Run Code Online (Sandbox Code Playgroud)

  • 对我来说很好用。谢谢! (2认同)

And*_*ahl 17

您可以在示波器上调用一个方法来为您反转它,如下所示:

<!doctype html>
<html ng-app="myApp">
<head>
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script src="http://code.angularjs.org/1.0.5/angular.min.js"></script>
    <script>
    angular.module('myApp', []).controller('Ctrl', function($scope) {
        $scope.items = [1, 2, 3, 4];
        $scope.reverse = function(array) {
            var copy = [].concat(array);
            return copy.reverse();
        }
    });
    </script>
</head>
<body ng-controller="Ctrl">
    <ul>
        <li ng-repeat="item in items">{{item}}</li>
    </ul>
    <ul>
        <li ng-repeat="item in reverse(items)">{{item}}</li>
    </ul>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

请注意,$scope.reverse因为Array.prototype.reverse修改了原始数组,所以创建了数组的副本.


Kum*_*mar 13

如果您使用的是1.3.x,则可以使用以下命令

{{ orderBy_expression | orderBy : expression : reverse}}
Run Code Online (Sandbox Code Playgroud)

示例按发布日期降序列出书籍

<div ng-repeat="book in books|orderBy:'publishedDate':true">
Run Code Online (Sandbox Code Playgroud)

来源:https://docs.angularjs.org/api/ng/filter/orderBy


小智 10

如果您使用的是angularjs 1.4.4及更高版本,一种简单的排序方法是使用" $ index ".

 <ul>
  <li ng-repeat="friend in friends|orderBy:$index:true">{{friend.name}}</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

查看演示