'Rename keys in reduce function

I am essentially receiving data from another API that takes the following structure

const ob = {
  "dataOne": [
    {
      "type": "Type 1",
      "name": "email.failed"
    },
    {
      "type": "Type 1",
      "name": "email.success"
    },
    {
      "type": "Type 2",
      "name": "email.success"
    },
    {
      "type": "Type 3",
      "name": "email.success"
    },
  ],
};

What I was doing what creating a new array which essentially gets each unique type and then does a total count and an individual count of each unique name.

I also have another data set I combine with this but omitted for this question.

The working code I have is

const ob = {
  "dataOne": [
    {
      "type": "Type 1",
      "name": "email.failed"
    },
    {
      "type": "Type 1",
      "name": "email.success"
    },
    {
      "type": "Type 2",
      "name": "email.success"
    },
    {
      "type": "Type 3",
      "name": "email.success"
    },
  ],
};

const dataReduced = ob.dataOne.reduce((acc, o) => {
  if (!acc[o.type]) {
    acc[o.type] = [
      {
        count: 0,
        'email.success': 0,
        'email.failed': 0,
      },
    ];
  }

  acc[o.type][0].count = (acc[o.type][0].count || 0) + 1;
  acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1;
  return acc;
}, {});

console.log(dataReduced);

What I can't figure out however, because it is matching on email.success is how to rename these in my final output. I essentially want to remove the email. part.

So instead, the console.log should be

{
  Type 1: [{
  count: 2,
  failed: 1,
  success: 1
}],
  Type 2: [{
  count: 1,
  failed: 0,
  success: 1
}],
  Type 3: [{
  count: 1,
  failed: 0,
  success: 1
}]
}

How would I achieve this?

Thanks



Solution 1:[1]

You can do something like this

const ob = {
  "dataOne": [
    {
      "type": "Type 1",
      "name": "email.failed"
    },
    {
      "type": "Type 1",
      "name": "email.success"
    },
    {
      "type": "Type 2",
      "name": "email.success"
    },
    {
      "type": "Type 3",
      "name": "email.success"
    },
  ],
};

const dataReduced = ob.dataOne.reduce((acc, o) => {
const name = o.name.replace('email.', '')
  if (!acc[o.type]) {
    acc[o.type] = [
      {
        count: 0,
        'success': 0,
        'failed': 0,
      },
    ];
  }

  acc[o.type][0].count = (acc[o.type][0].count || 0) + 1;
  acc[o.type][0][name] = acc[o.type][0][name] + 1;
  return acc;
}, {});

console.log(dataReduced);

Solution 2:[2]

I've no clue why the console output is actually in your Browser console and not in this JS Constainer, but here, no reduce, but I don't even see the reason why a reduce would be better here:

var arr = [
    {
      "type": "Type 1",
      "name": "email.failed"
    },
    {
      "type": "Type 1",
      "name": "email.success"
    },
    {
      "type": "Type 2",
      "name": "email.success"
    },
    {
      "type": "Type 3",
      "name": "email.success"
    },
];

var result = [];
for (var o of arr) {
    if (!result.hasOwnProperty(o.type)) {
        var newObj = {
            count: 1,
            failed: 0,
            success: 0,
        };
        if (o.name.indexOf('failed') !== -1) {
            newObj.failed++;
        }
        if (o.name.indexOf('success') !== -1) {
            newObj.success++;
        }
        result[o.type] = [newObj];
    } else {
        result[o.type][0].count++;
        if (o.name.indexOf('failed') !== -1) {
            result[o.type][0].failed++;
        }
        if (o.name.indexOf('success') !== -1) {
            result[o.type][0].success++;
        }
    }
}
console.log(result);

Solution 3:[3]

I resolved this using the for in loop:

for(let elem in dataReduced){
  dataReduced[elem][0]['success'] = dataReduced[elem][0]['email.success'];
  dataReduced[elem][0]['failed'] = dataReduced[elem][0]['email.failed'];
  delete dataReduced[elem][0]['email.success'];
  delete dataReduced[elem][0]['email.failed'];
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 R4ncid
Solution 2 Scriptkiddy1337
Solution 3 Igor Carvalho