Javascript 使用下划线js筛选、分组和聚合数据

Javascript 使用下划线js筛选、分组和聚合数据,javascript,reactjs,underscore.js,Javascript,Reactjs,Underscore.js,我有这样的原始数据: var data = { "issues": [ { "fields": { "project": { "key": "ProjectA" }, "components": [ { "name": "Component A" }, { "name": "Component C"

我有这样的原始数据:

var data = {
  "issues": [
    {
      "fields": {
        "project": {
          "key": "ProjectA"
        },
        "components": [
          {
            "name": "Component A"
          },
          {
            "name": "Component C"
          }
        ],
        "priority": {
          "name": "P0"
        },
        "status": {
          "name": "Closed"
        }
      }
    },
    {
      "fields": {
        "project": {
          "key": "ProjectA"
        },
        "components": [
          {
            "name": "Component B"
          }
        ],
        "priority": {
          "name": "P1"
        },
        "status": {
          "name": "Reopened"
        }
      }
    },
    {
      "fields": {
        "project": {
          "key": "ProjectA"
        },
        "components": [
          {
            "name": "Component B"
          }
        ],
        "priority": {
          "name": "P1"
        },
        "status": {
          "name": "Closed"
        }
      }
    },
    {
      "fields": {
        "project": {
          "key": "Project B"
        },
        "components": [
          {
            "name": "Component X"
          }
        ],
        "priority": {
          "name": "P1"
        },
        "status": {
          "name": "Closed"
        }
      }
    }
  ]
};
如果我将
ProjectA
作为输入,我希望过滤、分组和聚合输出,如下所示:

"components": [
  {
    "name": "Component A",
    "priorities": [
      {
        "name": "P0",
        "status": [
          {
            "name": "Open",
            "count": 0
          },
          {
            "name": "Reopened",
            "count": 0
          },
          {
            "name": "Closed",
            "count": 1
          }
        ]
      },
      {
        "name": "P1",
        "status": [
          {
            "name": "Open",
            "count": 0
          },
          {
            "name": "Reopened",
            "count": 0
          },
          {
            "name": "Closed",
            "count": 0
          }
        ]
      }
    ]
  },
  {
    "name": "Component B",
    "priorities": [
      {
        "name": "P0",
        "status": [
          {
            "name": "Open",
            "count": 0
          },
          {
            "name": "Reopened",
            "count": 0
          },
          {
            "name": "Closed",
            "count": 0
          }
        ]
      },
      {
        "name": "P1",
        "status": [
          {
            "name": "Open",
            "count": 0
          },
          {
            "name": "Reopened",
            "count": 1
          },
          {
            "name": "Closed",
            "count": 1
          }
        ]
      }
    ]
  },
  {
    "name": "Component C",
    "priorities": [
      {
        "name": "P0",
        "status": [
          {
            "name": "Open",
            "count": 0
          },
          {
            "name": "Reopened",
            "count": 0
          },
          {
            "name": "Closed",
            "count": 1
          }
        ]
      },
      {
        "name": "P1",
        "status": [
          {
            "name": "Open",
            "count": 0
          },
          {
            "name": "Reopened",
            "count": 0
          },
          {
            "name": "Closed",
            "count": 0
          }
        ]
      }
    ]
  }
]

我尝试了链接、筛选、分组,但不确定如何使用,因为我的数据太嵌套了。

这是一个纯javascript方案,首先收集所有组件和优先级,然后构建一个结果对象,然后增加状态计数

var数据={“问题”:[{“字段”:{“项目”:{“关键”:“项目A”},“组件”:[{“名称”:“组件C”}],“优先级”:{“名称”:“P0”},“状态”:{“名称”:“已关闭”}},{“字段”:{“项目”:{“关键”:“项目A”},“组件”:[{“名称”:“组件B”}],“优先级”:{“名称”:“P1”},状态”:{“名称”:“重新打开”}},{“字段”:{“项目”:{“键”:“项目A”},“组件”:[{“名称”:“组件B”}],“优先级”:{“名称”:“P1”},状态”:{“名称”:“关闭”},{“字段”:{“项目”:{“键”:“项目B”},组件”:[{“名称”:“组件X”}],“优先级”:{“名称”:“P1”},状态”:{“关闭”},
componentsO=Object.create(null),
prioritiesO=Object.create(null),
组件,
优先事项,
状态\=['Open'、'reopen'、'Closed'],//状态在chrome中与window.status冲突
hash=Object.create(null),
getKey=函数(a){返回a.join('|');},
结果={};
data.issues.forEach(功能(问题){
如果(issue.fields.project.key==='ProjectA'){
issue.fields.components.forEach(函数(组件){
componentsO[component.name]=true;
});
prioritiesO[issue.fields.priority.name]=true;
}
});
components=Object.keys(componentsO.sort();
优先级=Object.keys(prioritiesO.sort();
result.components=components.map(函数(组件){
返回{
名称:组件,
优先级:priorities.map(函数(优先级){
返回{
名称:优先权,
状态:状态映射(功能(状态){
var key=getKey([component,priority,status]);
哈希[键]={name:状态,计数:0};
返回散列[键];
})
};
})
}
});
data.issues.forEach(功能(问题){
如果(issue.fields.project.key==='ProjectA'){
issue.fields.components.forEach(函数(组件){
var key=getKey([component.name,issue.fields.priority.name,issue.fields.status.name]);
散列[key].count++;
});
}
});
console.log(结果);

作为控制台包装{max height:100%!important;top:0;}
您是指这部分
状态:status.map(函数(状态){…
?请检查
数组.isArray(状态)===true
。您可能有另一个名为
status
的变量,并且存在类型冲突。我刚刚使用SO中的
Run code snippet
功能运行了您的代码段,没有修改任何内容。您使用的浏览器是哪个?它是一个Chrome浏览器它在Chrome中与发生冲突。我将其重命名为
status