Массив угловых сортировок по значениям перечисления в этом - PullRequest
0 голосов
/ 04 июля 2018

У меня есть данные, которые я вызываю из службы http. Эти данные содержат названия месяцев, которые определены как объекты enum в порядке естественного календаря ... Теперь у меня есть массив, в котором я объединяю названия месяцев с некоторыми дополнительными целыми числами в dict. например:

[{name:Februar, value: 999},{name: Januar, value: 123}, {name: Oktober, value: 321},...]

Тогда я вставляю дикт в массив. Теперь я хотел бы отсортировать массив по статьям перечисления в словаре ... поэтому сначала идет январь, а затем февраль ... и т. Д.

[{name: Januar, value: 123},{name:Februar, value: 999}, {name: Oktober, value: 321},...]

Мой код выглядит так:

import { Component, OnInit, NgModule } from '@angular/core';
import {Http,Response} from '@angular/http';
import 'rxjs/add/operator/map';
import { BrowserModule } from '@angular/platform-browser';
import { NgxChartsModule } from '@swimlane/ngx-charts';

@Component({
  selector: 'productsbydemomonth',
  templateUrl: './productsbydemomonth.component.html',
  styleUrls: ['./productsbydemomonth.component.scss']
})
export class ProductsbydemomonthComponent implements OnInit {

  dataArray : any[];
  Anzahl: number[] = [];
  Monat: Monat;
  chartData: any = [];

  view: any[] = [700, 400];

  // options
  showXAxis = true;
  showYAxis = true;
  gradient = false;
  showLegend = true;
  showXAxisLabel = true;
  xAxisLabel = 'Monat';
  showYAxisLabel = true;
  yAxisLabel = 'Anzahl';


  monatConst: number = 12;

  colorScheme = {
    domain: ['#5AA454', '#A10A28', '#C7B42C', '#AAAAAA']
  };
  monthArray: Monat[] = [Monat.Januar, Monat.Februar, Monat.Maerz, Monat.April, Monat.Mai, Monat.Juni, Monat.Juli, Monat.August, Monat.September, Monat.Oktober, Monat.November,Monat.Dezember ]

  constructor(private http: Http) { }

  ngOnInit() {
    //this.getChartsData();
  }

  getChartsData() {
    return this.http.get('http://localhost:5555/DNZ/Produkt/Monat/by/' + (this.monatConst))
    .subscribe((res: Response) => {
      this.chartData = res.json() ;
      this.dataArray = this.formatData(this.chartData);       
    },
    (err) => {
      if (err.error instanceof Error) {
        console.log('Client-side error occured.');
      } else {
        console.log('Server-side error occured.');
      }
    });
  }

  formatData(someData) {
    this.dataArray = [];

    for (let dat of someData) {
      var dictChart = {
        name: dat.Monat,
        value: dat.Anzahl,      
      };
      //console.log(dictChart);
      this.dataArray.push(dictChart);
    }
    //console.log("Im Array:", this.dataArray);
    this.dataArray.sort(name);
    return this.dataArray;
  }

}


interface chartData {
  Anzahl : number,
  DemoID : number,
  Monat: Monat
}

enum Monat {"Januar","Februar","Maerz","April","Mai","Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}

Как мне отсортировать эти данные в массиве диктов по названию месяца? Чтобы они отображались на графике в правильном порядке названий месяцев по оси X? (не беспокойтесь о графике, он просто отображает порядок массива ...)

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

sort метод требует функции компаратора в качестве параметра, например ::10000

const monthNum = month => this.monthArray.indexOf(month);
dataArray.sort((a, b) => monthNum(a) - monthNum(b))

В основном функция принимает два аргумента и должна возвращать некоторое значение, которое меньше или равно 0, равно 0 или больше 0 (между прочим. true и false равны 1 и 0 соответственно, поэтому фактически может возвращать логическое значение значение тоже).

0 голосов
/ 04 июля 2018

Вы можете попробовать это решение:

arr.sort((data, prev) => {
    return this.monthArray.indexOf(data.name) - this.monthArray.indexOf(prev.name);
})
0 голосов
/ 04 июля 2018

Отображение месяцев в значения для сортировки

То, что вы хотите сделать, это использовать .sort, но сортировка использует значения для сортировки вверх и вниз, поэтому вам необходимо сопоставлять каждый месяц со значением, как показано ниже:

const months = {
	January: 0,
	February: 1,
	March: 2,
	April: 3
}

let yourObject = [{month:'April'},{month:'January'},{month:'March'}]

console.log(yourObject.sort((data, prev) => months[data.month] - months[prev.month]))

.sort((data, prev) => months[data.month] - months[prev.month])

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