将向量中的元素求和为打字稿

时间:2019-02-01 13:47:33

标签: typescript ecmascript-6

如何根据名称对值求和? 我已经尝试过了,但是遇到了麻烦。 我想写的名字不重复``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 :(得分:1)

您可以使用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)