按对象键过滤对象数组

4

我有一个Javascript的对象数组:

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

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

我希望获得两个新的对象数组;一个是关键员工“Joe”,另一个是关键员工“Jerry”。这些对象应该保持相同的键/值对。我一直在尝试使用underscore.js来解决问题,但是它变得太复杂了。你有什么想法可以实现吗?

4
你想提供名称还是希望根据名称自动分组对象?请分享你目前尝试过的内容。 - Felix Kling
_.groupBy_.pluck,很可能会用到。 - John Dvorak
从Javascript对象列表中提取对象属性 - John Dvorak
有2个“Joe”。你希望结果看起来像什么? - gen_Eric
4个回答

6
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发行版中均可使用。

如果您事先不知道名称,那么可以创建一个映射变量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 中的约定是仅对构造函数中的第一个字母进行大写,因此 List 应该改写为 list。

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

0
为了完整性,Underscore也有一个_.filter版本,它可以与_.matcher迭代器简写一起使用。这本质上是Ben McCormick的答案的缩短版。
var joe = _.filter(List, {employee: 'Joe'});
var jerry = _.filter(List, {employee: 'Jerry'});

0

抱歉 - 我还没有足够的声望来评论,但我相信应该是这样的

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接