2

我在 Javascript 中有一组对象:

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

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

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

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

4

4 回答 4

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

于 2013-03-07T15:15:08.373 回答
3
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"
        }
    ]
}
于 2013-03-07T15:17:45.343 回答
0

抱歉 - 我没有代表。尚未发表评论,但我认为应该是

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

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

于 2014-01-28T09:39:03.930 回答
0

为了完整起见,还有 Underscore 的版本,_.filter它与_.matcheriteratee简写一起使用。这本质上是本麦考密克答案的一个更短的版本。

var joe = _.filter(List, {employee: 'Joe'});
var jerry = _.filter(List, {employee: 'Jerry'});
于 2021-02-17T17:28:53.850 回答