Group and count values in an array

后端 未结 4 470
感情败类
感情败类 2020-12-01 13:06

I have an array with objects, like the following.

b = {
  \"issues\": [{
    \"fields\": {
      \"status\": {
        \"id\": \"200\",
        \"name\": \"B         


        
4条回答
  •  不知归路
    2020-12-01 13:37

    This is a perfect opportunity to use Array#reduce. That function will take a function that is applied to all elements of the array in order and can be used to accumulate a value. We can use it to accumulate an object with the various counts in it.

    To make things easy, we track the counts in an object as simply {name: count, otherName: otherCount}. For every element, we check if we already have an entry for name. If not, create one with count 0. Otherwise, increment the count. After the reduce, we can map the array of keys, stored as keys of the object, to be in the format described in the question. See below.

    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 does not modify the original array.
    2. You can easily modify the function passed to reduce to for example not distinguish between Backlog and backlog by changing

      var name = c.fields.status.name;
      

      into

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

      for example. More advanced functionality can also easily be implemented.

提交回复
热议问题