我在Javascript对象的数组:
var List = [
{
employee:'Joe',
type:'holiday',
},
{
employee:'Jerry',
type:'seminar',
},
{
employee:'Joe',
type:'shore leave',
}
];
我想获得对象的两个新的阵列; 一个关键员工“乔”,另一个关键员工“杰里”。 该对象应保持相同的对键/值。
我一直在试图让使用underscore.js一个解决方案,但它越来越太复杂了。 这是如何的任何想法可以实现吗?
提前致谢
var emps = {};
_.each(List, function(item){
emps[item.employee] = emps[item.employee] || [];
emps[item.employee].push(item);
});
或使用groupBy
var emps = _.groupBy(List, function(item){
return item.employee;
});
console.log(emps);
给
{
"Jerry": [
{
"employee": "Jerry",
"type": "seminar"
}
],
"Joe": [
{
"employee": "Joe",
"type": "holiday"
},
{
"employee": "Joe",
"type": "shore leave"
}
]
}
var joe = List.filter(function(el){
return el.employee === "Joe"
});
var jerry = List.filter(function(el){
return el.employee === "Jerry"
});
这使用Array.prototype.filter ,将在IE9和高达+所有新版Chrome / Firefox / Safari /歌剧发行工作。
如果你不提前知道的名字,那么你可以创建一个映射变种名称= {};
for(var i =0; i<List.length; i++){
var ename = List[i].employee;
if(typeof names[ename] === "undefined"){
names[ename] = List.filter(function(el){
return el.employee === "ename"
});
}
}
作为一个侧面说明,使用Javascript的惯例是只利用一个可变的对构造的第一个字母。 所以名单也许应该名单。
对不起 - 我没有代表。 发表评论,但是我认为它应该是
return el.employee === ename; // No quotes around ename
否则,答案@Ben给人完美 - 它可以扩展成一个“GROUPBY”功能,如果使用下划线是出了问题一个项目。