按价格和类似名称分组价值

时间:2014-10-17 05:27:41

标签: c# angularjs

我有一个这样的数组:

[{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",价格:3}
  • {姓名:" .org.in",价格:5} =>与.com.in相似的名称,但价格不同。
  • {姓名:" .com",价格:9}
  • {姓名:" .net",价格:9} =>与.com相同但价格不同的价格
  • {姓名:" .in",价格:3}

我试图循环使用这些值,但似乎并不是一个好主意。我打开服务器端c#或angularjs,underscorejs。

2 个答案:

答案 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是不同的组)。在顺序处理列表时使用此比较器。