对数组中的值进行分组和计数

2024-01-16

我有一个包含对象的数组,如下所示。

b = {
  "issues": [{
    "fields": {
      "status": {
        "id": "200",
        "name": "Backlog"
      }
    }
  }, {
    "fields": {
      "status": {
        "id": "202",
        "name": "close"
      }
    }
  }, {
    "fields": {
      "status": {
        "id": "201",
        "name": "close"
      }
    }
  }]
};

我想计算有多少问题有状态close,以及有多少个backlog。我想将计数保存在新数组中,如下所示。

a = [
  {Name: 'Backlog', count: 1},
  {Name: 'close', count: 2}
];

我已经尝试过以下方法。

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
    });
  }
});

然而,这似乎不起作用。我应该如何实施这个?


这是一个绝佳的使用机会Array#reduce https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce。该函数将采用一个按顺序应用于数组所有元素的函数,并可用于累加一个值。我们可以用它来累积一个包含各种计数的对象。

为了让事情变得简单,我们简单地跟踪对象中的计数{name: count, otherName: otherCount}。对于每个元素,我们检查是否已经有一个条目name。如果没有,则创建一个带有计数的0。否则,增加计数。之后reduce, 我们可以map https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map键数组,存储为对象的键 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys,采用问题中描述的格式。见下文。

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);
.as-console-wrapper {
  max-height: 100% !important;
}

Notes.

  1. Array#reduce不修改原始数组。
  2. 您可以轻松修改传递给reduce的函数,例如不区分Backlog and backlog通过改变

    var name = c.fields.status.name;
    

    into

    var name = c.fields.status.name.toLowerCase();
    

    例如。还可以轻松实现更高级的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对数组中的值进行分组和计数 的相关文章

随机推荐