2014-11-25 40 views
0

是否有一种简单,优雅的方式来按照惯常的顺序排列数组,但将任何缺失值视为0(或任意任意设置的值)而不是undefined是否有`orderBy`过滤器功能允许它正确处理可选属性?

例如所以,下面的代码

<li ng-repeat="item in items | orderBy:['-optionalKey', 'secondaryKey']">{{ item.secondaryKey }}</li> 

与像

$scope.items = [ 
    {secondaryKey: 75, optionalKey: 25}, 
    {secondaryKey: 100}, 
    {secondaryKey: 50, optionalKey: 0}, 
]; 

数据集中会产生这种

<li>75</li> 
<li>50</li> 
<li>100</li> 

,而不是这个

<li>100</li> 
<li>75</li> 
<li>50</li> 

播放用在这里:http://plnkr.co/edit/G3nQyEzHfUiiovJTD44Y?p=preview

我知道我可以重新实现整个orderBy过滤器,但是这不是很维护或面向未来。我也可以在常规的orderBy过滤器中使用函数作为谓词,但是我仍然必须将已经内置的复杂参数重新实现到orderBy(例如,深度嵌套,+/-反转等)。什么我真的不知道是如果有一些语法,我不知道,让我做这样的事情:

<li ng-repeat="item in items | orderBy:['-optionalKey', 'secondaryKey']:false:0">{{ item.secondaryKey }}</li> 

...其中第三个参数(0)代表我想falsy治疗价值/丢失键为。

回答

0

原来,答案是比我想象的简单,因为角度的内置$parse方法轻松处理深键嵌套:

$scope.orderByDefault = function(path, defaultValue){ 
    var getter = $parse(path); 

    return function(item){ 
     return getter(item) || defaultValue; 
    }; 
}; 

<li ng-repeat="item in items | orderBy:[orderByDefault('optionalKey.nestedKey', 0),'-secondaryKey']:true"></li> 

@TODO:处理+/-谓词前缀,所以我不必扭转整个数组。

0

我目前这样做的方法是通过运行在阵列上的过滤器之前,责令其填充使用默认值我希望他们有,像这样的任何可选字段:

.filter('orderByDefault', function(){ 
    return function(array, key, defaultValue){ 
    return array.map(function(item){ 
     if(! item[key]) item[key] = defaultValue; 

     return item; 
    }); 
    }; 
}) 

<li ng-repeat="item in items | orderByDefault:'optionalKey':0 | orderBy:['-optionalKey', 'secondaryKey']">{{ item.secondaryKey }}</li> 

在这里看到一个例子:http://plnkr.co/edit/W9OwBpd7V7syJXkzxnsV?p=preview

我很担心这是不是高性能的,因为它可能是因为我迭代/ COPYIN g阵列不断。它还修改了原始数组的内容,这可能会导致副作用,并不一定是需要的。更重要的是,它仍然不能处理深度嵌套,这是我绝对需要支持的。

+0

深键嵌套版本:http://plnkr.co/edit/xE03dyAWLMr7oqjIs3rw?p=preview – 2014-11-26 17:17:07

相关问题