gyc*_*gyc 2 javascript arrays function angularjs
基于如下所示的数组:
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}
];
Run Code Online (Sandbox Code Playgroud)
我需要为每个团队创建一个无序列表.
可以直接用ngRepeat和过滤器完成吗?
或者更容易将数组重新组织成一个包含成员列表的团队数组?
var teams = [
{id: 1, members: ["john", "kevin"]},
{id: 2, members: ["rob", "matt"]},
{id: 3, members: ["clint", "will"]}
]
Run Code Online (Sandbox Code Playgroud)
嵌套的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);
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
Mih*_*nut 11
你有group
物品.为此,我使用reduce
方法来创建一个如下所示的hash
集合:
{
"1": [
"john",
"kevin"
],
"2": [
"rob",
"matt"
],
"3": [
"clint",
"will"
]
}
Run Code Online (Sandbox Code Playgroud)
reduce()方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值.
以下步骤是针对map
此集合的array
.为此,您应该使用map
方法.
map()方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数.
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);
Run Code Online (Sandbox Code Playgroud)
扩展了@ Alexandru-Ionut Mihai的答案,(只是为了体验一个reduce
功能有多强大).这里是一个单一的,reduce
没有map
它再次实现同样的事情.:)
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);
Run Code Online (Sandbox Code Playgroud)