Sha*_*yuh 12 javascript arrays
我有一个包含对象的数组,如下所示.
b = {
"issues": [{
"fields": {
"status": {
"id": "200",
"name": "Backlog"
}
}
}, {
"fields": {
"status": {
"id": "202",
"name": "close"
}
}
}, {
"fields": {
"status": {
"id": "201",
"name": "close"
}
}
}]
};
Run Code Online (Sandbox Code Playgroud)
我想要计算有多少问题有状态close,有多少有问题backlog.我想将计数保存在一个新数组中,如下所示.
a = [
{Name: 'Backlog', count: 1},
{Name: 'close', count: 2}
];
Run Code Online (Sandbox Code Playgroud)
我尝试了以下内容.
b.issues.forEach(function(i) {
var statusName = i.fields.status.name;
if (statusName in a.Name) {
a.count = +1;
} else {
a.push({
Name: statusName,
count: 1
});
}
});
Run Code Online (Sandbox Code Playgroud)
然而,这似乎并没有起作用.我该如何实现呢?
Jus*_*ent 26
这是一个绝佳的使用机会Array#reduce.该函数将采用一个按顺序应用于数组的所有元素的函数,并可用于累积值.我们可以使用它来累积具有各种计数的对象.
为简单起见,我们只是简单地跟踪对象中的计数{name: count, otherName: otherCount}.对于每个元素,我们检查是否已经有一个条目name.如果没有,请创建一个带计数的0.否则,递增计数.之后reduce,我们可以map将存储为对象键的键数组采用问题中描述的格式.见下文.
var b = {
"issues": [{
"fields": {
"status": {
"id": "200",
"name": "Backlog"
}
}
}, {
"fields": {
"status": {
"id": "202",
"name": "close"
}
}
}, {
"fields": {
"status": {
"id": "201",
"name": "close"
}
}
}]
};
var counts = b.issues.reduce((p, c) => {
var name = c.fields.status.name;
if (!p.hasOwnProperty(name)) {
p[name] = 0;
}
p[name]++;
return p;
}, {});
console.log(counts);
var countsExtended = Object.keys(counts).map(k => {
return {name: k, count: counts[k]}; });
console.log(countsExtended);Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper {
max-height: 100% !important;
}Run Code Online (Sandbox Code Playgroud)
笔记.
Array#reduce 不会修改原始数组.您可以轻松修改传递的函数以减少,例如不区分Backlog和backlog通过更改
var name = c.fields.status.name;
Run Code Online (Sandbox Code Playgroud)
成
var name = c.fields.status.name.toLowerCase();
Run Code Online (Sandbox Code Playgroud)
例如.还可以轻松实现更高级的功能.
像这样的事情应该可以解决问题。只需迭代您的数据,保留 2 个计数器,其中包含每种类型问题的数量,并最终创建您想要的数据格式。在jsfiddle上尝试一下。
var b = {
"issues": [{
"fields": {
"status": {
"id": "200",
"name": "Backlog"
}
}
}, {
"fields": {
"status": {
"id": "202",
"name": "close"
}
}
}, {
"fields": {
"status": {
"id": "201",
"name": "close"
}
}
}]
};
var data = [];
for(var issue of b.issues){
var entryFound = false;
var tempObj = {
name: issue.fields.status.name,
count: 1
};
for(var item of data){
if(item.name === tempObj.name){
item.count++;
entryFound = true;
break;
}
}
if(!entryFound){
data.push(tempObj);
}
}
console.log(data);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11579 次 |
| 最近记录: |