【问题标题】:Lodash - extending objects from array with nested object informationLodash - 使用嵌套对象信息从数组扩展对象
【发布时间】:2016-03-02 18:44:50
【问题描述】:

我有点进入函数式编程。我的问题是关于如何从嵌套数据中映射信息。

我有很多公司。

[  
  {
    _id: 123,
    name: "Company"
  }, 
  {
    _id: 789,
    name: "Company"
  }
];

我有很多团队。

[  
  {
    _id: 555,
    name: "Team name A",
    companyId: 123
  }, 
  {
    _id: 666,
    name: "Team name B",
    companyId: 123
  },
  {
    _id: 777,
    name: "Team name C",
    companyId: 789
  }
];

我想将每个公司的团队放入公司对象中。预期结果是:

[  
  {
    _id: 123,
    name: "Company",
    teams: [  
             {
               _id: 555,
               name: "Team name A",
               companyId: 123
             }, 
             {
               _id: 666,
               name: "Team name B",
               companyId: 123
             }
           ]
  }, 
  {
    _id: 789,
    name: "Company",
    teams: [  
             {
               _id: 777,
               name: "Team name A",
               companyId: 789
             }
           ]
  }
];

我的解决方案是分几个步骤进行:

teamsGroupedByCompany = _.group(teams, 'companyId');

var findTeamsByCompanyId = function(groupedTeams, companyId){
    return _.chain(groupedTeams)
            .find(function(value, key){
               return companyId == key;
            })
            .flatten()
            .defaults([])
            .value();
}

_.map(companies, function(company){
    company.team = findTeamsByCompanyId(teamsGroupedByCompany, company._id);
})

是否可以以链接方式完成,或者我必须创建高阶函数来处理这类问题?目前我正在使用 lodash。

这里是 jsbin https://jsbin.com/buqiji/edit?js,console

【问题讨论】:

    标签: functional-programming lodash


    【解决方案1】:

    下面的代码可以解决问题。

    companies = _.chain(companies)
    .map(function(company) {
      company.teams = _.filter(teams, {'companyId': company._id});
      return company;
    })
    .value();
    

    这是一个 JsBin:https://jsbin.com/cudoheziyi/1/edit?js,console

    【讨论】:

      【解决方案2】:

      我的解决方案与您的类似。我也是分两步做的。

      您已经拥有teamsGroupedByCompany,因此您可以使用它直接将团队分配给每个公司,而无需执行findTeamsByCompanyId。这是我的解决方案:

      (假设companiesteams已经初始化)

      const groupedTeams = _.groupBy(teams, 'companyId');
      const combined = _.map(companies, c => {
        c.teams = groupedTeams[c._id] || [];
        return c;
      });
      

      http://jsbin.com/mixewo/1/edit?js,console

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        相关资源
        最近更新 更多