[JavaScript] Mediathek durchsuchen mit parallelen Strukturen

Parantatatam

mag Cookies & Kekse
Hallo allerseits,

ich habe gerade ein kleines Effizienzproblem, denn ich arbeite gerade daran einen eigenen Musikplayer mit Audiotheksverwaltung zu schreiben und das mit AngularJS und Fuse. Hierbei entsteht auch schon das Problem, denn beide Bibliotheken brauchen unterschiedlich strukturierte Arrays um die Daten darstellen zu können bzw. sie durchsuchen zu können. Um es mal zu verdeutlichen:
Javascript:
// Struktur von Fuse
var fuse = new Fuse([
  {
    "artist": "J.B.O.",
    "album": "Head Bang Boing",
    "track": "Acht"
  },
  {
    "artist": "J.B.O.",
    "album": "Head Bang Boing",
    "track": "Bejonze"
  },
  // ... entries
], { "keys": [ "artist", "album", "track" ] });

// Struktur von AngularJS
$scope.artists = [
  {
    "name": "J.B.O.",
    "albums": [
      {
        "name": "Head Bang Boing",
        "tracks": [
          {
            "name": "Acht"
          },
          {
            "name": "Bejonze"
          },
          // tracks ...
        ]
      },
      // albums ...
    ]
  },
  // artists ...
];
Leider kann ich in Fuse nicht die Struktur von AngularJS nutzen und andersherum geht es leider auch nicht. Jedoch ist es so, dass ich mit Fuse meine Audiothek durchsuche und dann mir mit AngularJS dementsprechend die Ergebnisse anzeigen lassen will. Bisher habe ich nur die Alben von J.B.O. bei mir ausprobiert, jedoch dauert es da schon sehr lange. Ich möchte mir gar nicht vorstellen, wie das aussieht, wenn ich meine ganze Audiothek durchsuche, welche um die 100.000 Einträge hat.

Fällt jemanden eine Möglichkeit ein, wie ich hier optimieren kann oder wie ich die Strukturen parallel miteinander verlinken kann?

Nachtrag: ich benutze übrigens folgende Funktion um von Fuse zu AngularJS umzuwandeln:
Javascript:
var convertFromFuseToAngular = function (entries) {
    var artistNames = [],
            albumNames  = [],
            artists     = [],
            albums      = [],
            tracks      = [];
   
    // find artists
    for ( var i in entries ) {
        artistNames.push(entries[i].artist);
    }
   
    // make artists unique
    artistNames = jQuery.unique(artistNames);
   
    for ( var i in artistNames ) {
        albumNames = [];
        albums     = [];
        // find albums of the current artist
        for ( var j in entries ) {
            if ( entries[j].artist === artistNames[i] ) {
                albumNames.push(entries[j].album);
            }
        }
       
        // make albums unique
        albumNames = jQuery.unique(albumNames);
       
        for ( var j in albumNames ) {
            tracks = [];
            // find tracks of the current album
            for ( var k in entries ) {
                if ( entries[k].artist === artistNames[i] && entries[k].album === albumNames[j] ) {
                    tracks.push(new Track(
                        // file entry
                        entries[k].entry,
                        // track name
                        entries[k].track,
                        // track number
                        entries[k].trackNumber,
                        // disc number
                        entries[k].discNumber
                    ));
                }
            }
            // add tracks to the current album
            albums.push(new Album(
                // album name
                albumNames[j],
                // tracks
                tracks
            ));
        }
   
        // add albums to the current artist
        artists.push(new Artist(
            // artist name
            artistNames[i],
            // albums
            albums
        ));
    }
   
    return artists;
};
 
Okay, also die Struktur von Fuse geht doch in AngularJS, jedoch ist die Suche trotzdem sehr langsam. Hat jemand eine Idee, wie man das verbessern könnte?
 

Neue Beiträge

Zurück