Javascript ngRepeat将类似数组的对象视为对象而不是数组

Javascript ngRepeat将类似数组的对象视为对象而不是数组,javascript,arrays,angularjs,object,ng-repeat,Javascript,Arrays,Angularjs,Object,Ng Repeat,我有一种叫做NoDupesArray的东西。我使用它创建了一个数组,其中不允许重复项。以编程方式,它是一个扩展阵列原型的对象,如下所示:让我们不要争论object.create vs this: function NoDupesArray(){} NoDupesArray.prototype = Array.prototype NoDupesArray.prototype.push = function(){ //...blahblahblha } 不幸的是,当我在ng repeat

我有一种叫做NoDupesArray的东西。我使用它创建了一个数组,其中不允许重复项。以编程方式,它是一个扩展阵列原型的对象,如下所示:让我们不要争论object.create vs this:

function NoDupesArray(){}
NoDupesArray.prototype = Array.prototype
NoDupesArray.prototype.push = function(){
    //...blahblahblha
}
不幸的是,当我在ng repeat in Angular中使用此数组时,我无法使用Angular的内置过滤器功能。这不起作用:

<li class="row" ng-repeat="task in tasks | filter:{completed_at:'!null'}"></li>

我假设这是因为angular将任务视为对象而不是数组。有没有办法强制angular将我的自定义数组识别为数组,以便我可以使用过滤器?谢谢

所以现在我使用的解决方案是:

<li class="row" ng-repeat="task in tasks.slice() | filter:{completed_at:'!null'}"></li>

这将使NoDupesArray变回一个普通的旧数组,但我认为必须有更好的方法来实现这一点。

如果任务是一个对象,您仍然可以使用ng repeat。您应该为对象中的值和键提供两个变量,如下所示:

<li class="row" ng-repeat="(key, task) in tasks | filter:{completed_at:'!null'}"></li>

保持Array.push的原始功能

NoDupesArray.prototype.push = function (){
  return function() {
    var uniqueArguments = getItemsNotInArray(this, arguments);
    return Array.prototype.push.apply(this, uniqueArguments);
  };
};

是的,这就是函数的主体。问题似乎是angular没有使用instanceof来检查NodesArray是数组还是对象。不幸的是,该代码不起作用。看起来filterFilter只是返回未过滤的数组,如果它认为它不是数组,即使它是数组。朋友为我找到了这个: