Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

SilentDragon

Alter Hase

  • »SilentDragon« ist der Autor dieses Themas

Beiträge: 530

Wohnort: Köln

Beruf: Student

  • Private Nachricht senden

1

07.07.2016, 11:50

Javascript (AngularJS) Filter von Objekten

Hallo zusammen,

Ich hab auf einer Seite mehrere Tabellen, die durch Objekt Arrays gefüllt werden ca. so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
"members": [
    {
      "id": 3,
      "role": {
        "role_id": 1,
        "label": "Administrator"
      },
      "vorname": "test",
      "nachname": "user",
      "bday": 768960000,
      "active": true
    }]

nun würde ich gerne die Arrays filtern, zurzeit gehe ich für jede Tabelle so vor (acfilters unterscheidet sich von Tabelle zu Tabelle, da die Objekte völlig unterschiedlich aufgebaut sind):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$scope.acfilters = {};
    $scope.acfilters.role = {active: false, count:0, type: 'number', parent: 'role', path:'role_id', label:'Role', value: ''};
    $scope.acfilters.id = {active: false, count:0, type: 'number', path:'id', label:'ID', value: ''};
    $scope.acfilters.vorname = {active: false, count:0, type: 'text', path:'vorname', label:'Vorname', value: ''};
    $scope.acfilters.nachname = {active: false, count:0, type: 'text', path:'nachname', label:'Nachname', value: ''};

    $scope.customFilter = function(user) {
        var ok = true;
        for(i in $scope.acfilters) {
            if($scope.acfilters[i].parent)
                var obj = user[$scope.acfilters[i].parent][$scope.acfilters[i].path];
            else
                var obj = user[$scope.acfilters[i].path];

            if($scope.acfilters[i].active && obj){
                switch($scope.acfilters[i].type){
                    case 'number':
                        if(obj != $scope.acfilters[i].value)
                            ok = false;
                        break;
                    case 'text':
                        if(!(obj.indexOf($scope.acfilters[i].value) > -1))
                            ok = false;
                        break;
                }
            }
        }
        if(ok)
        return user;
    }

Das ganze sieht sehr unschön aus, value kann immer nur einen wert enthalten (man kann z.b. nicht nach 2 Rolen(Admin/Tester) filtern) und count sollte die Anzahl der Elemente enthalten wenn man den Filter aktiviert :D
Ich sitze schon seit Stunden daran und sehe vermutlich den Wald vor lauter Bäumen nicht mehr ;(
Hat jemand schon so etwas gemacht und kennt eine saubere schöne Lösung ?

LG
SD
...

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

12.07.2016, 23:43

Ich finde für sowas lodash ganz praktisch. Mit sowas wie https://lodash.com/docs#filter braucht man sich dann nur das entsprechende Teilobjekt zusammenbasteln. Bei mehreren gleichen Filter weiß ich auf Anhieb aber nicht ob es da direkt was passendes gibt. Ansonsten müsste man Vereinigungen bilden.