Ниже приведено чисто функциональное решение, сочетающее в себе пару полезных приемов. Обратите внимание, что вы можете повторно использовать частичные функции где-то еще в коде. Кроме того, таким образом, вычисления могут распараллеливаться и распределяться (хотя JavaScript еще не существует).
let raw = [
{"name": "total_kills_glock", "value": 70},
{"name": "total_kills_mac10", "value": 39},
{"name": "total_kills_ump45", "value": 136},
{"name": "total_shots_glock", "value": 1262},
{"name": "total_hits_glock", "value": 361},
{"name": "total_shots_mac10", "value": 862},
{"name": "total_hits_mac10", "value": 261},
{"name": "total_shots_ump45", "value": 1610},
{"name": "total_hits_ump45", "value": 598}
];
//you can use any parsing technique here, including regexp
const parse = name => {
const a = name.split("_");
return { key: a[2], metric: a[1] }
};
const groupBy = getKey => (rv, x) => {
(rv[getKey(x)] = rv[getKey(x)] || []).push(x);
return rv;
};
//converts [{key,metric,value},...] to {name:key, m1:v1, m2:v2,...}
const recombine = arr => Object.assign({name: arr[0].key},
...Array.from(arr, ({key, metric, value}) => ({[metric]: value}) ));
const groupedByKey = raw
.map( ({name, ...attrs}) => ({...parse(name), ...attrs}))
.reduce(groupBy(x => x.key),{});
const result = Object.values(groupedByKey).map(recombine);
console.log(result);
Я не тестировал его, но не удивлюсь, если он будет работать лучше, чем решение Ника с некоторыми наборами данных. Тем не менее, это может быть не так просто поддерживать, в зависимости от команды и навыков.