Суммируйте массив объектов Javascript по ключу - PullRequest
0 голосов
/ 10 июля 2019

Я посмотрел через переполнение стека и чувствую, что есть гораздо более простое решение, использующее карту и уменьшение для решения этой проблемы, но это мой неуклюжий способ решить ее до сих пор. Мне нужно суммировать данные по датам, не имея «ключа» в исходном объекте json. Ниже приведен фрагмент кода и результат, который, кажется, работает. Буду признателен за любой вклад в улучшение этого. Спасибо.

// input 
var array1 = [{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}];
var array2 = [{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}];
var array3 = [{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}];

// output should look like this
// [{2019-07-13: 8, 2019-07-14: 13, 2019-07-15: 22}]

var combinedArray = [];
var finalArraySum = [];

// combine all the arrays into one...
var arrays = array1.concat(array2, array3);
arrays.forEach((array, index) => {
	Object.keys(array).forEach(function(key) {
		var element = [key, array[key]];
		combinedArray.push(element);
	})
});

// loop through the combined arrays
combinedArray.forEach((item, index) => {
	// figure out if the item already exists in the final summed up array
	var sumExists = finalArraySum.filter((innerItem, index) => {
		return innerItem[0] === item[0];
	});
	// if not exists, then push the initial one
	if(sumExists.length === 0) {
		finalArraySum.push([item[0], item[1]]);
	} else {
		// else add up to the already existing one
		sumExists[0][1] = item[1] + sumExists[0][1];
	}
})
console.log(finalArraySum);
var finalObject = [];
var stringObject = '{';
finalArraySum.forEach((item, index) => {
	console.log(item);
	stringObject = stringObject + '"' + item[0] + '":"' + item[1] + '",';
});
stringObject = stringObject.substr(0, stringObject.length - 1) + "}";
console.log(JSON.parse(stringObject));
finalObject.push(JSON.parse(stringObject));
console.log(finalObject);

Ответы [ 3 ]

1 голос
/ 10 июля 2019

Вы можете сделать это, используя Array.prototype.reduce -

const concat = (a = {}, b = {}) =>
  Object
    .entries(b)
    .reduce
      ( (r, [ k, v ]) =>
          ({ ...r, [k]: (r[k] || 0) + v })
      , a
      )

const main = (...all) =>
  all.reduce(concat, {})
  
var array1 =
  [{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}]

var array2 =
  [{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}]

var array3 =
  [{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}]

console.log(main(...array1, ...array2, ...array3))
// { '2019-07-13': 8
// , '2019-07-14': 13
// , '2019-07-15': 22 
// }
1 голос
/ 10 июля 2019

Как отмечает @HereticMonkey, этот вопрос, вероятно, лучше подходит сообществу Code Review , поскольку StackOverflow обычно предназначен для получения помощи при решении конкретных проблем, а не для обсуждения качества функционального кода.Просто помните об этом в следующий раз.

Как говорится, да, здесь можно использовать Array#reduce, но это не самый простой способ.Две петли и некоторая деструктура - все, что вам нужно.

var array1 = [{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}];
var array2 = [{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}];
var array3 = [{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}];

let mergedInput = [...array1, ...array2, ...array3];

let temp = {};
for (a of mergedInput) {
	for (const [k, v] of Object.entries(a)) {
  	temp[k] = (temp[k]||0)+a[k];
  }
}

console.log(temp);

Если вам все еще интересно увидеть реализацию Array#reduce, посмотрите мой первый ответ в истории изменений 1015 *.

0 голосов
/ 10 июля 2019

Вы можете объединить все объекты в один массив и уменьшить его следующим образом:

const array1 = [{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}];
const array2 = [{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}];
const array3 = [{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}];

const all = [...array1, ...array2, ...array3];

const sumtotal = Object.keys(array1[0]).reduce((acc, key) => {
  return { ...acc, [key]: all.reduce((acc, arr) => acc + arr[key], 0) };
}, {});

console.log(sumtotal);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...