2

I have an array of object some with same month name but different values based on day. How do we group array object based on same property value for example:

 [ { month: 'Jan', value: 3 },
  { month: 'Jan', value: 3.5 },
  { month: 'Feb', value: 2.1 },
  { month: 'Mar', value: 6 },
  { month: 'Apr', value: 4.3 },
  { month: 'May', value: 5.5 },
  { month: 'Jun', value: 7 },
  { month: 'Jun', value: 9 },
  { month: 'Jul', value: 7 },
  { month: 'Jul', value: 9 },
  { month: 'Jul', value: 7 },
  { month: 'Aug', value: 9 },
  { month: 'Sep', value: 9 },
  { month: 'Sep', value: 9 },
  { month: 'Oct', value: 8 },
  { month: 'Oct', value: 5 },
  { month: 'Oct', value: 3 },
  { month: 'Nov', value: 12 },
  { month: 'Nov', value: 19.5 } ]

So what i want to get is new array with month and sum of month values:

[{month:"Jan", val:6.5},{month:"Feb", val:5.6},{month:"Mar", val:6},].
2

3 Answers 3

6

You could take a Map and reduce the array by adding the value to the month nad get new arrays from the grouped result.

var data = [{ month: 'Jan', value: 3 }, { month: 'Jan', value: 3.5 }, { month: 'Feb', value: 2.1 }, { month: 'Mar', value: 6 }, { month: 'Apr', value: 4.3 }, { month: 'May', value: 5.5 }, { month: 'Jun', value: 7 }, { month: 'Jun', value: 9 }, { month: 'Jul', value: 7 }, { month: 'Jul', value: 9 }, { month: 'Jul', value: 7 }, { month: 'Aug', value: 9 }, { month: 'Sep', value: 9 }, { month: 'Sep', value: 9 }, { month: 'Oct', value: 8 }, { month: 'Oct', value: 5 }, { month: 'Oct', value: 3 }, { month: 'Nov', value: 12 }, { month: 'Nov', value: 19.5 }],
    result = Array.from(
        data.reduce(
            (m, { month, value }) => m.set(month, (m.get(month) || 0) + value),
            new Map
        ),
        ([month, value]) => ({ month, value })
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Sign up to request clarification or add additional context in comments.

Comments

2

A simple human-readable solution can be as follows:

var input = [ { month: 'Jan', value: 3 },
  { month: 'Jan', value: 3.5 },
  { month: 'Feb', value: 2.1 },
  { month: 'Mar', value: 6 },
  { month: 'Apr', value: 4.3 },
  { month: 'May', value: 5.5 },
  { month: 'Jun', value: 7 },
  { month: 'Jun', value: 9 },
  { month: 'Jul', value: 7 },
  { month: 'Jul', value: 9 },
  { month: 'Jul', value: 7 },
  { month: 'Aug', value: 9 },
  { month: 'Sep', value: 9 },
  { month: 'Sep', value: 9 },
  { month: 'Oct', value: 8 },
  { month: 'Oct', value: 5 },
  { month: 'Oct', value: 3 },
  { month: 'Nov', value: 12 },
  { month: 'Nov', value: 19.5 } ];

var result = [];

for (var i = 0; i < input.length; i++) {
    var data = input[i];
    var found=false;
    for(var j=0; j<result.length; j++) {
        if(result[j].month === data.month) {
            found=true;
            result[j].value += data.value;
            break;
        }
    }
    if(!found) {
        result.push(data);
    }
}

//The result array is your desired result
console.log(result);

Comments

0
 result = input.reduce(function(res, value){
            if (!res[value.month]) {
                res[value.month] = {
                    month: value.month,
                    value: 0
                }
                result.push(res[value.month])
            }
            res[value.month].value += value.value
            return res;
           }, {});
             console.log(result)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.