按对象键过滤对象数组

时间:2013-03-07 15:09:00

标签: javascript arrays underscore.js

我在Javascript中有一组对象:

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

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

我想获得两个新的对象数组;一个用于关键员工“Joe”,另一个用于关键员工“Jerry”。对象应保持相同的键/值对。

我一直在尝试使用underscore.js来获得解决方案,但它变得太复杂了。关于如何实现这一点的任何想法?

提前致谢

4 个答案:

答案 0 :(得分:3)

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 / Opera版本中使用。

如果您事先不知道名字,那么您可以创建地图 var names = {};

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约定只是为构造函数大写变量的第一个字母。所以列表应该是列表。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

抱歉 - 我没有代表。发表评论,但我相信它应该是

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

否则@Ben给出的答案是完美的 - 如果在项目中使用下划线是不可能的,它可以扩展为'groupby'函数。

答案 3 :(得分:0)

为了完整起见,还有 _.filter 的 Underscore 版本,它与 _.matcher 迭代对象 shorthand 一起使用。这本质上是 Ben McCormick 的 answer 的一个更短的版本。

var joe = _.filter(List, {employee: 'Joe'});
var jerry = _.filter(List, {employee: 'Jerry'});