Group and count values in an array

后端 未结 4 455
感情败类
感情败类 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:23

    Using ES6 Arrow functions you can do it with minimum syntax

    var b = {
        "issues": [{
            "fields": {
                "status": {
                    "id": "200",
                    "name": "Backlog"
                }
            }
        }, {
            "fields": {
                "status": {
                    "id": "202",
                    "name": "close"
                }
            }
        }, {
            "fields": {
                "status": {
                    "id": "201",
                    "name": "close"
                }
            }
        }]
    };
    
    var countOfBackLog = b.issues.filter(x => {
    return x.fields.status.name === "Backlog"
    }).length
    
    var countOfClose = b.issues.filter(x => {
    return x.fields.status.name === "close"
    }).length
    
    a =[{Name: 'Backlog', count : countOfBackLog}, {Name: 'close', count : countOfClose}]
    

    More about arrow functions here

    0 讨论(0)
  • 2020-12-01 13:31

    You can write like this. It is dynamic.

    var a = {}; 
    for(var key in b["issues"]){ 
        if(!a.hasOwnProperty(b["issues"][key].fields.status.name)){
         a[b["issues"][key].fields.status.name] = 1;
        }else{
         a[b["issues"][key].fields.status.name] = a[b["issues"][key].fields.status.name]+1;
        }
    }
    var c = [];
    for(var key1 in a){
       c.push({
       name  : key1,
       count : a[key1]
       });
    }
    
    0 讨论(0)
  • 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.

    0 讨论(0)
  • 2020-12-01 13:45

    Something like this should do the trick. Simply iterate over your data, keep 2 counters with the number of each type of issue, and create the data format you want in the end. Try it live on 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);
    
    0 讨论(0)
提交回复
热议问题