2016-03-02 60 views
1

我有点进入函数式编程。我的问题是关于如何映射来自嵌套数据的信息。Lodash - 使用嵌套对象信息从数组中扩展对象

我有一系列公司。

[ 
    { 
    _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

回答

1

我的解决办法是与你相似。我也分两步来做。

您已经拥有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