【问题标题】:Filter array of objects by object key按对象键过滤对象数组
【发布时间】:2013-03-07 15:09:00
【问题描述】:

我在 Javascript 中有一个对象数组:

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

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

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

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

【问题讨论】:

标签: javascript arrays underscore.js


【解决方案1】:
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 版本中运行。

如果您事先不知道名称,则可以创建地图 变量名称 = {};

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。

【讨论】:

    【解决方案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"
            }
        ]
    }
    

    【讨论】:

      【解决方案3】:

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

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

      否则@Ben 给出的答案是完美的 - 如果项目无法使用下划线,它可以扩展为“groupby”函数。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2018-10-20
          • 2020-09-29
          • 1970-01-01
          • 1970-01-01
          • 2018-04-03
          • 2018-11-12
          • 1970-01-01
          • 1970-01-01
          • 2019-02-22
          相关资源
          最近更新 更多