Javascript 将对象数组转换为具有聚合的层次结构的函数方法

Javascript 将对象数组转换为具有聚合的层次结构的函数方法,javascript,Javascript,我正在寻找一个功能解决方案,将此对象映射到一个层次结构中,并按实践、主题区域和资产分组,以便此对象: var data = { "research": [ { "practice": "Talent Management", "id": "20992", "title": "Creating a Culture of Leadership", "subjectArea": "Talent Strategy" }, { "practice": "Talent Managemen

我正在寻找一个功能解决方案,将此对象映射到一个层次结构中,并按实践、主题区域和资产分组,以便此对象:

var data = {
  "research": [
    { "practice": "Talent Management", "id": "20992", "title": "Creating a Culture of Leadership", "subjectArea": "Talent Strategy" },
    { "practice": "Talent Management", "id": "20993", "title": "Talent Economics", "subjectArea": "Talent Strategy" },
    { "practice": "Talent Management", "id": "20990", "title": "Finding the Right Talent", "subjectArea": "Recruiting" },
    {  "practice": "Human Resources", "id": "20994", "title": "Tips from the Front", "subjectArea": "HR Training" },
    { "practice": "Human Resources", "id": "20995", "title": "Reward Programs", "subjectArea": "Employee Engagement" },
  ]
}
转换为此(计算机构的项目数并将机构的主题区域添加为子项,计算机构内主题区域的项目数并将资产(id和标题)添加为主题区域的子项):


我还没有能够整理出地图并减少使用的组合,以产生正确的计数结果,并感谢任何见解

可能不是这样的(根据上面的注释),但如果任何人需要将平面对象数组转换为层次结构,您只需指定嵌套顺序、级别数和字段名,这里有一个递归函数来执行此操作-。希望能对其他人有所帮助。

为什么
研究
没有
大小
字段?为什么要使用
映射
减少
来执行此操作?你能不用它吗?这不是SO来这里的目的。我们在这里回答的问题是,为什么代码会这样做,以及其他与软件工程和编程相关的特定问题。我们不是专门来为你做你的工作/爱好的。如果您有一个部分解决方案,请粘贴它并要求我们帮助您理解/调试/修复它,但不要给我们一个函数的规范,并期望得到良好的响应。另外,从字面上看,这个问题有数十亿个好答案,我们称之为“太宽”,我可以不用map或reduce,我想嵌套for循环就足够了。正如工程师Dollery指出的那样,我要求使用map或reduce来了解这是如何实现的,所以它被用来理解代码的行为,在这个特殊的例子中,我试图理解它在这个例子中是如何使用的。但在今天结束时,我试图看到一个如何进行这种转换的实际工作示例—映射、减少或常规循环。谢谢
{
  "name": "research",
    "children": [
      {
        "name": "Talent Management", "size": 3, "children": [
          {
            "name": "Talent Strategy", "size": 2, "children": [
              { "name": "Creating a Culture of Leadership", "id": "20992", "size": 1 },
              { "name": "Talent Economics", "id": "20993", "size": 1 }
            ]
          },
          {
            "name": "Recruiting", "size": 1, "children": [
              { "title": "Finding the Right Talent", "id": "20990", "size": 1 },
            ]
          }
        ]
      },
      {
        "name": "Human Resources", "size": 2, "children": [
          {
            "name": "HR Training", "size": 1, "children": [
              { "name": "Tips from the Front", "id": "20994", "size": 1 },
            ]
          },
          {
            "name": "Employee Engagement", "size": 1, "children": [
              { "name": "Reward Programs", "id": "20995", "size": 1 },
            ]
          }
        ]
      }, 
    ]  
}