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
。