对象的滤光器阵列由对象键(Filter array of objects by object key

2019-07-21 03:45发布

我在Javascript对象的数组:

var List = [
            {
                employee:'Joe',
                type:'holiday',
            },
            {
                employee:'Jerry',
                type:'seminar',

            },
            {
                employee:'Joe',
                type:'shore leave',
            }
           ];

我想获得对象的两个新的阵列; 一个关键员工“乔”,另一个关键员工“杰里”。 该对象应保持相同的对键/值。

我一直在试图让使用underscore.js一个解决方案,但它越来越太复杂了。 这是如何的任何想法可以实现吗?

提前致谢

Answer 1:

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"
        }
    ]
}


Answer 2:

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的惯例是只利用一个可变的对构造的第一个字母。 所以名单也许应该名单。



Answer 3:

对不起 - 我没有代表。 发表评论,但是我认为它应该是

return el.employee === ename;  // No quotes around ename

否则,答案@Ben给人完美 - 它可以扩展成一个“GROUPBY”功能,如果使用下划线是出了问题一个项目。



文章来源: Filter array of objects by object key