我有一个这样的数组:
[{Name:".com.in", Price: 3},{Name:".net.in", Price:3}, {Name:".org.in", Price:5}, {Name:".com", Price:9},{Name:".net", Price:9},{Name:".in", Price:3}]
我想将这些值分组为优先顺序排列的组:价格,类似的域名扩展名
我试图循环使用这些值,但似乎并不是一个好主意。我打开服务器端c#或angularjs,underscorejs。
答案 0 :(得分:2)
您可以使用angular.filter模块的groupBy。
只需将JS文件从此处添加:http://www.cdnjs.com/libraries/angular-filter到您的项目并使用以下代码。
var myApp = angular.module('myApp',['angular.filter']);
function MyCtrl($scope) {
$scope.items = [
{Name:".com.in", Price: 3},
{Name:".net.in", Price:3},
{Name:".org.in", Price:5},
{Name:".com", Price:9},
{Name:".net", Price:9},
{Name:".in", Price:3}
];
}
div ng-controller="MyCtrl">
<ul ng-repeat="(key, value) in items | groupBy: 'Price'">
<b>Price: {{ key }}</b>
<li ng-repeat="item in value">
item: <i> {{ item.Name }} </i>
</li>
</ul>
</div>
如果我完全理解你,这就是你想要的。
这是JSFiddle的工作示例。
答案 1 :(得分:1)
(假设您正在使用c#标签执行此服务器端)...
我建议使用List<T>
来存储项而不是数组。
然后,您可以使用List.Sort(IComparer comp)
对列表进行排序。
然后你可以构建多个IComparer
个对象来根据你想要的任意对你的对象进行排序(一个比较器用于价格,另一个用于名称,另一个用于......)。
如果比较器同时使用分组和优先顺序逻辑,则结果将是一个长列表,其中元素按组和优先级顺序排序。即。
Compare(Object x, Object y)
{
MyItem i1 = (MyItem)x;
MyItem i2 = (MyItem)y;
if(i1.Price != i2.Price)
{
//sort by group
return (i1.Price < i2.Price);
}
else
{
//sort priority within group
return LevenshteinDistance(i1.Name,i2.Name);
}
}
private int LevenshteinDistance(string s1, string s2)
{
...
}
如果您需要计算组边界,请使用仅具有组逻辑的另一个IComparer(即,如果IComparer说A&lt; B则A和B是不同的组)。在顺序处理列表时使用此比较器。