Объединение объектов в массив - PullRequest
0 голосов
/ 06 мая 2020

У меня есть один javascript массив:

[0: {name: "John", currency: "BTC", amount: 0.1298499}
1: {name: "John", currency: "USD", amount: 0}
2: {name: "Mike", currency: "BTC", amount: 0}
3: {name: "Mike", currency: "USD", amount: 0.01}
4: {name: "Mike", currency: "XRP", amount: 0}]

Мне нужен результат:

[0: {name: "John", btc: 0.1298499, usd: 0, xrp: 0}
1: {name "Mike", btc: 0, usd: 0.01, xrp: 0}]

Пожалуйста, используйте Javascript и учтите, что первый массив может иметь бесконечное количество имен и бесконечное количество валют, и в любой момент я мог бы добавить новый элемент в этот массив с новым именем и / или новой валютой.

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Вы можете взять стандартный алгоритм группировки и собрать все валюты в объекте и взять этот объект как образец для не заданных валют в объекте.

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 }],
    pattern = { name: undefined },
    result = Object
        .values(data.reduce((r, { name, currency, amount }) => {
            r[name] = r[name] || { name };
            r[name][currency] = (r[name][currency] || 0) + amount;
            pattern[currency] = 0;
            return r;
        }, {}))
        .map(o => ({ ...pattern, ...o }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 06 мая 2020

Использование reduce упростит эту задачу. Создайте объект поиска и добавьте к нему валюты.

var users = [
  {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},]

// Grab a list of all currencies with value set to 0
var currencies = users.reduce(function(obj, record) {
  obj[record.currency] = 0
  return obj
}, {})

// loop over the data with reduce to join the records
var mapped = users.reduce(function(obj, record) {
  // grab the name of the entry
  const name = record.name
  // check to see if we have seen it
  //if we have, use it, else create new record with name and currencies zeroed out
  obj[name] = obj[name] || Object.assign({ name: name }, currencies)
  // add the currency to the existing value
  obj[name][record.currency] = obj[name][record.currency] + record.amount
  // return the updated object to the reduce method
  return obj
}, {})

// turn our object into an array
var result = Object.values(mapped)

console.log(result)
0 голосов
/ 06 мая 2020

Может быть так:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...