按价格和类似名称对值进行分组
本文关键字: | 更新日期: 2023-09-27 18:26:47
我有一个这样的数组:
[{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}]
我想将这些值按优先级分组:价格,类似的域扩展
- {名称:".com.in",价格:3},{姓名:".net.in"
- {名称:".org.in",价格:5}=>与.com.in名称相似,但价格不同
- {名称:".com",价格:9}
- {名称:".net",价格:9}=>与.com价格相同,但名称不同
- {名称:".in",价格:3}
我试着循环浏览这些值,但似乎不是一个好主意。我打开服务器端的c#或angularjs,undercorejs。
您可以使用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的工作示例。
。。。
我建议使用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(即,如果IComparel说A<B,则A和B是不同的组)。按顺序处理列表时,请使用此比较器。