molily: Arrays filtern, zaehlen, ausgeben

Beitrag lesen

Hallo,

Du denkst hier über Caching nach, welches das wiederholte Durchsuchen der Liste vereinfacht. Caching ist nur nötig, wenn das erneute Filtern der Daten zu schwierig oder zu langsam ist. Vor allem, wenn es verschiedene Filterdimensionen gibt, so ist ein wiederholter Map-Reduce ohne großes Caching vielleicht einfacher – nicht unbedingt schneller, aber wenn es nicht gerade 100.000 Datensätze sind, fällt das nicht ins Gewicht.

Falls du Metadaten erzeugst, um das Filtern zu vereinfachen, so müsstest du die verschiedenen Filterdimensionen berücksichtigen. Man kann hier, wie bereits vorgeschlagen, weitere Objekte erzeugen, die die Fahrten gruppiert enthalten. Vollständig wäre: Nach Woche, dann nach ID (letzte Zeile), dann nach Start-Ziel-ID, dann ein Array mit den Fahrten.

  
var fahrt1 = { id: '1', woche: '6', stadt: 'BERLIN', datum: new Date(), ankunft: new Date() }; // oder was auch immer die Spalten bedeuten  
var hash = {  
  '6': {  
    'BERLIN': {  
      'Berlin-Hannover': [  
        fahrt1  
      ]  
    }  
  }  
};

Erzeugen kann ich eine solche Struktur mit Lodash-Helfern, z.B. mit mehreren groupBy.

Ob diese Verschachtelung nötig ist, weiß ich nicht. Bei dieser Hashstruktur kann ich manches schnell nachschlagen, muss aber, je nachdem wie hoch ich ansetze, merge, map bzw. flatten verwenden, um an die letztlichen Fahrten zu kommen. Wenn ich nach einer Woche, einer Stadt und Strecke filtere, dann ist die Struktur gut:

var fahrten = hash[woche][stadt][strecke];  
fahrten[i]  
fahrten.length

Wenn ich nur nach Strecke filtere, muss ich die erste und zweite Ebene durchlaufen bzw. auflösen, damit ich alle Fahrten durchsuche. Da wären weitere Gruppierungs-Objekte sinnvoll.

Ich würde hier erst einmal versuchen, ohne solche Hashes zu arbeiten, sondern rein funktional (d.h. ohne Änderung der Ausgangs-Datenstruktur) die Liste anhand aller Kriterien zu filtern. Das Kriterium »es müssen mindestens X Einträge existieren, auf die Y zutrifft« lässt sich mit groupBy bzw. countBy umsetzen.

Map-Reduce und rein funktionale Programmierung sind hier die Richtungen, die ich empfehlen kann. Die genannten Tools sind dafür gut geeignet.

Mathias