Группировка и сумма массива объектов по числовому ключу - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь создать статистическую круговую диаграмму. Как http response я получаю список с сервера, с помощью которого мне нужно нарисовать круговую диаграмму.

Например: полученные данные:

[{1: 9, 2: 7}, {3:8, 2: 1}, {1:8, 5:9}, {2:3, 3:1}]

Это желаемый результат:

[{x: 1, y: 17}, {x: 2, y:10}, {x: 3, y: 9}, {x: 5, y: 9}]

Обратите внимание: x - это ключ, а y - сумма схожих значений ключа

Я пытался data.forEach((item, index) => {}). После того, как я это напишу, я не получаю информации о том, как я могу комбинировать Object.keys(item), Object.values(item) и Object.values(item).reduce((a,b)=> return a+b;)

Это может показаться глупым вопросом, но любая помощь будет принята с благодарностью. :)

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Вы можете reduce массив. Создайте объект-аккумулятор с каждым числом в качестве ключа и и объект с ключами x и y в качестве значения. Переберите каждый объект и обновите значение y в зависимости от числа. Затем используйте Object.values() для возвращаемого объекта, чтобы получить значения аккумулятора в виде массива

const input = [{1: 9, 2: 7}, {3:8, 2: 1}, {1:8, 5:9}, {2:3, 3:1}]

const grouped = input.reduce((acc, obj) => {
  for (const x in obj) {
    acc[x] = acc[x] || { x , y: 0 }
    acc[x].y += obj[x]
  }
  return acc;
}, {})

console.log(Object.values(grouped))
0 голосов
/ 08 июля 2019

Вы можете найти тот же ключ и обновить или вставить новый объект.

Этот подход не меняет порядок клавиш.

var data = [{ 1: 9, 2: 7 }, { 3: 8, 2: 1 }, { 1: 8, 5: 9 }, { 2: 3, 3: 1 }] ,
    result = data.reduce((r, o) => {
        Object.entries(o).forEach(([x, y]) => {
            var temp = r.find(o => o.x === x);
            if (temp) temp.y += y;
            else r.push({ x, y });
        });        
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...