Суммирование элементов в векторе для машинописи - PullRequest
0 голосов
/ 01 февраля 2019

Как мне сложить значения на основе имени?Я так пробовал, но у меня проблемы.Я хотел бы написать имя, не повторяя с накопленной суммой значений в «dataGrf».

Я сделал небольшой пример ниже, чтобы проиллюстрировать, что я пытаюсь сделать.

PS: я прошу прощения за мой английский

Ex) data: = [
  { 'id': 1, 'value': 10, 'name': 'Mary' },
  { 'id': 2, 'value': 5, 'name': 'John' },
  { 'id': 3, 'value': 2, 'name': 'Mary' },
  { 'id': 4, 'value': 3, 'name': 'Lauren' },
  { 'id': 5, 'value': 2, 'name': 'Lauren' },
  { 'id': 6, 'value': 6, 'name': 'Mary' },
];
expected result: 

dataGrf: [
  { 'name': 'Mary', 'valueAcum': 18 },
  { 'name': 'John', 'valueAcum': 5 },
  { 'name': 'Lauren', 'valueAcum': 5 }
]

Моя ChartModel:

export class ChartModel {
  constructor(
      public name?: string,
      public valueAcum?: number
  ) { }
}

Моя функция:

loadData() {
    this.loading = true;
    this.dataChart.emit(null);

    this.dataService.getData(this.year, this.month).
      subscribe((data: dataModel[]) => {

        let dataSort: dataModel[];

        dataSort = data.filter(f => f.value> 0)
        dataSort = dataSort.sort((a, b) => a.value> b.value? -1 : 1)

        this.dataChart.emit(dataSort);

        this.dataGrf = new Array<ChartModel>();

        let valueAcum= dataSort.reduce((sum, record) => {

          let nameArea = data.map(f => f.name);
          nameArea = nameArea.filter(function (item, pos) {
            return nameArea.indexOf(item) == pos;
          });

          if (record.name === nameArea[0]) {
            return sum + record.value;
          }
            return sum;
        }, 0);

        dataSort.forEach(f => {
          this.dataGrf.push(new ChartModel(f.name, valueAcum))
        });

        this.loading = false;
      }
  }

1 Ответ

0 голосов
/ 01 февраля 2019

Преобразование данных можно выполнить с помощью функции reduce, чтобы создать другой объект, ключами которого являются имена, а значениями являются объекты с ключами name и valueAccum.Затем вы преобразуете этот объект в массив с Object.values:

const data = [
  { 'id': 1, 'value': 10, 'name': 'Mary' },
  { 'id': 2, 'value': 5, 'name': 'John' },
  { 'id': 3, 'value': 2, 'name': 'Mary' },
  { 'id': 4, 'value': 3, 'name': 'Lauren' },
  { 'id': 5, 'value': 2, 'name': 'Lauren' },
  { 'id': 6, 'value': 6, 'name': 'Mary' },
];

const result = Object.values(data.reduce((accum, { name, value }) => {
  const accumValue = accum[name] ? accum[name].valueAccum : 0;
  accum[name] = { name, valueAccum: value + accumValue  };
  return accum;
}, {}));

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