当前位置: 首页 > 知识库问答 >
问题:

Lodash-使用嵌套对象信息从数组扩展对象

韦宏朗
2023-03-14

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

我有很多公司。

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

这是jsbinhttps://jsbin.com/buqiji/edit?js控制台

共有2个答案

邹学民
2023-03-14

我的解决方案与你的类似。我也分两步来做。

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

(假设公司团队已经初始化)

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

http://jsbin.com/mixewo/1/edit?js安慰

易波涛
2023-03-14

下面的代码将完成此任务。

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

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

 类似资料:
  • name String version String

  • 我想把下面的数组转换成一个稍微修改的对象(见下文)。我也在尝试使用扩展运算符,但还没有弄清楚如何做到这一点。我试图避免使用lodash(用于教育目的)。 null

  • 我有如下所示的数据 现在我想获取所有记录的地址,但是当您看到输出时,我将其作为[对象]获取。那么任何人都可以告诉我如何获得地址吗? 这是我的代码: 输出:

  • 我怎么能转换一个大的到与洛塔什?

  • 编组或取消编组对象 您可以将若干个对象合并到一个组中,把这些对象作为一个单元同时进行处理。这样,您就可以同时移动或变换若干个对象,且不会影响其属性或相对位置。例如,您可能想将徽标设计中的对象编成一组,以便将其作为一个单元进行移动和缩放。 编组对象被连续堆叠在图稿的同一图层上,位于组中最前端对象之后;因此,编组可能会更改对象的图层分布及其在给定图层上的堆叠顺序。如果您选择位于不同图层中的对象并将其编

  • 我需要更新嵌套在我的用户文档中的一个字段,该字段包含一个part对象数组,以添加新的part。一个part对象如下所示: 所以这意味着$addToset对我的情况没有好处...现在我不知道该怎么办。