我有点进入函数式编程。我的问题在于如何映射嵌套数据中的信息。
我有一系列公司。
[
{
_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。
答案 0 :(得分:1)
以下代码可以解决问题。
companies = _.chain(companies)
.map(function(company) {
company.teams = _.filter(teams, {'companyId': company._id});
return company;
})
.value();
答案 1 :(得分:1)
我的解决方案与您的解决方案类似。我也分两步完成。
您已经拥有teamsGroupedByCompany
,因此您可以使用它直接为每个公司分配团队,而无需执行findTeamsByCompanyId
。这是我的解决方案:
(假设companies
和teams
已初始化)
const groupedTeams = _.groupBy(teams, 'companyId');
const combined = _.map(companies, c => {
c.teams = groupedTeams[c._id] || [];
return c;
});