在AngularJS中对对象数组进行分组

时间:2017-04-06 06:27:00

标签: javascript angularjs arrays function

基于如下所示的数组:

var members = [
  {name: "john", team: 1},
  {name: "kevin", team: 1},
  {name: "rob", team: 2},
  {name: "matt", team: 2},
  {name: "clint", team: 3},
  {name: "will", team: 3}
];

我需要为每个团队创建一个无序列表。

可以直接用ngRepeat和过滤器完成吗?

或者更容易将数组重新组织成一组包含成员列表的团队?

var teams = [
  {id: 1, members: ["john", "kevin"]},
  {id: 2, members: ["rob", "matt"]},
  {id: 3, members: ["clint", "will"]}
]

嵌套的ngRepeat很容易实现,但是如何以简单/聪明的方式从第一个数组转到这个数组呢?

注意:数组不是来自数据库,而是来自html表。所以它只是一个单独的成员列表。

function MyController() {
  this.members = [
    {name: "john", team: 1},
    {name: "kevin", team: 1},
    {name: "rob", team: 2},
    {name: "matt", team: 2},
    {name: "clint", team: 3},
    {name: "will", team: 3}
  ];
}

angular.module('app', []);
angular.module('app')
    .controller('MyController', MyController);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.3/angular.min.js"></script>
<div ng-app="app">
  <div ng-controller="MyController as ctrl">
    <ul>
      <li ng-repeat="member in ctrl.members">{{ member.name }} - {{ member.team }}</li>
    </ul>
  </div>
</div>

5 个答案:

答案 0 :(得分:9)

您必须group项。为此,我使用了reduce方法来创建 一个hash集合,如下所示:

{
  "1": [
    "john",
    "kevin"
  ],
  "2": [
    "rob",
    "matt"
  ],
   "3": [
     "clint",
      "will"
   ]
}
  

reduce()方法对累加器和每个都应用一个函数   数组中的元素(从左到右)将其缩小为单个元素   值。

以下步骤是maparray此集合。为此,您应该使用map方法。

  

map()方法创建一个新数组,其中包含调用a的结果   为此数组中的每个元素提供了函数。

&#13;
&#13;
var members = [
  {name: "john", team: 1},
  {name: "kevin", team: 1},
  {name: "rob", team: 2},
  {name: "matt", team: 2},
  {name: "clint", team: 3},
  {name: "will", team: 3}
];
var groups = members.reduce(function(obj,item){
    obj[item.team] = obj[item.team] || [];
    obj[item.team].push(item.name);
    return obj;
}, {});
var myArray = Object.keys(groups).map(function(key){
    return {team: key, name: groups[key]};
});
console.log(myArray);
&#13;
&#13;
&#13;

答案 1 :(得分:5)

扩展@ Alexandru-Ionut Mihai的答案,(只是为了体验reduce功能的强大功能)..这里是单reduce而不必map 1}}它再次实现同样的目的。 :)

&#13;
&#13;
var members = [
  {name: "john", team: 1},
  {name: "kevin", team: 1},
  {name: "rob", team: 2},
  {name: "matt", team: 2},
  {name: "clint", team: 3},
  {name: "will", team: 3}
];
/*var teams = [
  {id: 1, members: ["john", "kevin"]},
  {id: 2, members: ["rob", "matt"]},
  {id: 3, members: ["clint", "will"]}
]*/
var group_to_values = members.reduce(function(arr, item){
    arr[item.team - 1] = arr[item.team - 1] || { id: item.team, members: []};
    arr[item.team - 1].members.push(item.name);
    return arr;
}, []);

console.log(group_to_values);
&#13;
&#13;
&#13;

答案 2 :(得分:2)

如果您使用的是underscore.js,那么您可以使用_.groupBy()方法在团队的基础上对记录数组进行分组。

function MyController() {
  this.members = [
    {name: "john", team: 1},
    {name: "kevin", team: 1},
    {name: "rob", team: 2},
    {name: "matt", team: 2},
    {name: "clint", team: 3},
    {name: "will", team: 3}
  ];

var grouped = _.groupBy(this.members, function(member) {
  return member.team;
});
}

答案 3 :(得分:1)

您可以像这样使用groupBy过滤器

int a = 10;
*int b = &a; // 0x1

*0x1 -> 10
*0x2 -> 1203104

请参阅此FIDDLE

答案 4 :(得分:0)

var members = [
  {name: "john", team: 1},
  {name: "kevin", team: 1},
  {name: "rob", team: 2},
  {name: "matt", team: 2},
  {name: "clint", team: 3},
  {name: "will", team: 3}
];
var groups = members.reduce(function(obj,item){
    obj[item.team] = obj[item.team] || [];
    obj[item.team].push(item.name);
    return obj;
}, {});
var myArray = Object.keys(groups).map(function(key){
    return {team: key, name: groups[key]};
});
console.log(myArray);