我如何能得到一个反向数组在角? 我试图使用orderBy过滤器,但它需要一个谓词(例如。'name')排序:

<tr ng-repeat="friend in friends | orderBy:'name':true">
      <td>{{friend.name}}</td>
      <td>{{friend.phone}}</td>
      <td>{{friend.age}}</td>
<tr>

是否有一种方法可以反转原始数组,而不需要排序。 像这样:

<tr ng-repeat="friend in friends | orderBy:'':true">
      <td>{{friend.name}}</td>
      <td>{{friend.phone}}</td>
      <td>{{friend.age}}</td>
<tr>

当前回答

我自己对这个问题感到沮丧,所以我修改了@Trevor Senior创建的过滤器,因为我遇到了一个问题,我的控制台说它不能使用反向方法。我还想保持对象的完整性,因为这是Angular最初在ng-repeat指令中使用的。在这种情况下,我使用的输入愚蠢(键),因为控制台会感到不安,说有重复,在我的情况下,我需要跟踪$index。

过滤器:

angular.module('main').filter('reverse', function() {
    return function(stupid, items) {
    var itemss = items.files;
    itemss = itemss.reverse();  
    return items.files = itemss; 
  };
});

HTML: <div ng-repeat="item in items track by $index | reverse: items">

其他回答

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

app.filter('reverse', function() {
  return function(items) {
    return items.slice().reverse();
  };
});

然后可以这样使用:

<div ng-repeat="friend in friends | reverse">{{friend.name}}</div>

看它在这里工作:活塞演示


这个过滤器可以根据您的需要进行定制。我在演示中提供了其他示例。一些选项包括在执行反转之前检查变量是否是数组,或者使其更宽松,以允许反转更多内容,如字符串。

有用的提示:

你可以用普通Js来反转你的数组:

注意:反向是破坏性的,所以它会改变你的数组,而不仅仅是变量。

如果您使用1.3。X,你可以使用下面的方法

{{ orderBy_expression | orderBy : expression : reverse}}

按出版日期降序列出图书

<div ng-repeat="book in books|orderBy:'publishedDate':true">

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

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

<tr ng-repeat="friend in friends | orderBy:'$index':true">

我发现了类似这样的东西,但我使用对象而不是数组。

下面是我对对象的解决方案:

添加自定义过滤器:

app.filter('orderObjectBy', function() {
    return function(items, field, reverse){

        var strRef = function (object, reference) {
            function arr_deref(o, ref, i) {
                return !ref ? o : (o[ref.slice(0, i ? -1 : ref.length)]);
            }
            function dot_deref(o, ref) {
                return !ref ? o : ref.split('[').reduce(arr_deref, o);
            }
            return reference.split('.').reduce(dot_deref, object);
        };

        var filtered = [];

        angular.forEach(items, function(item) {
           filtered.push(item);
        });
        filtered.sort(function (a, b) {
           return (strRef(a, field) > strRef(a, field) ? 1 : -1);
        });
        if(reverse) filtered.reverse();
        return filtered;
    };
});

然后可以用like

<div ng-repeat="(key, value) in items | orderObjectBy:'field.any.deep':true">

如果你需要旧的浏览器支持,你需要定义reduce函数(这只在ECMA-262 mozilla.org中可用)

// Production steps of ECMA-262, Edition 5, 15.4.4.21
// Reference: http://es5.github.io/#x15.4.4.21
if (!Array.prototype.reduce) {
Array.prototype.reduce = function(callback /*, initialValue*/) {
'use strict';
  if (this == null) {
    throw new TypeError('Array.prototype.reduce called on null or undefined');
  }
  if (typeof callback !== 'function') {
    throw new TypeError(callback + ' is not a function');
  }
  var t = Object(this), len = t.length >>> 0, k = 0, value;
  if (arguments.length == 2) {
    value = arguments[1];
  } else {
    while (k < len && !(k in t)) {
      k++; 
    }
    if (k >= len) {
      throw new TypeError('Reduce of empty array with no initial value');
    }
    value = t[k++];
  }
  for (; k < len; k++) {
    if (k in t) {
      value = callback(value, t[k], k, t);
    }
  }
  return value;
};
}