Может быть так:
var data = [
{name: "John", currency: "BTC", amount: 0.1298499},
{name: "John", currency: "USD", amount: 0},
{name: "Mike", currency: "BTC", amount: 0},
{name: "Mike", currency: "USD", amount: 0.01},
{name: "Mike", currency: "XRP", amount: 0}
];
function compile_data(_data){
var out = [];
var cur_arr = [];
var name_arr = []
for(var key in _data){
if(!cur_arr.includes(_data[key].currency)){
cur_arr.push(_data[key].currency);
}
if(!name_arr.includes(_data[key].name)){
name_arr.push(_data[key].name);
}
}
for(var kn in name_arr){
var new_obj = {};
new_obj.name = name_arr[kn];
for(var kc in cur_arr){
new_obj[cur_arr[kc]] = 0;
}
for(var key in _data){
if(_data[key].name == new_obj.name){
new_obj[_data[key].currency] += _data[key].amount;
}
}
out.push(new_obj);
}
return out;
}
console.log(compile_data(data));
При необходимости нижний регистр:
var data = [
{name: "John", currency: "BTC", amount: 0.1298499},
{name: "John", currency: "USD", amount: 0},
{name: "Mike", currency: "BTC", amount: 0},
{name: "Mike", currency: "USD", amount: 0.01},
{name: "Mike", currency: "XRP", amount: 0}
];
function compile_data(_data){
var out = [];
var cur_arr = [];
var name_arr = []
for(var key in _data){
var lc_cur = (_data[key].currency).toLowerCase();
if(!cur_arr.includes(lc_cur)){
cur_arr.push(lc_cur);
}
if(!name_arr.includes(_data[key].name)){
name_arr.push(_data[key].name);
}
}
for(var kn in name_arr){
var new_obj = {};
new_obj.name = name_arr[kn];
for(var kc in cur_arr){
new_obj[cur_arr[kc]] = 0;
}
for(var key in _data){
if(_data[key].name == new_obj.name){
var lc_cur = (_data[key].currency).toLowerCase();
new_obj[lc_cur] += _data[key].amount;
}
}
out.push(new_obj);
}
return out;
}
console.log(compile_data(data));