ordina per più campi in angolare


382

Come ordinare usando più campi contemporaneamente in angolare? pugno per gruppo e poi per sottogruppo per esempio

$scope.divisions = [{'group':1,'sub':1}, {'group':2,'sub':10}, {'group':1,'sub':2},{'group':1,'sub':20},{'group':2,'sub':1},
    {'group':2,'sub':11}];

Volevo visualizzare questo come

gruppo: sottogruppo

1 - 1

1 - 2

1 - 20

2 - 1

2 - 10

2 - 11

<select ng-model="divs" ng-options="(d.group+' - '+d.sub) for d in divisions | orderBy:'group' | orderBy:'sub'" />

Risposte:


659

Si prega di vedere questo:

http://jsfiddle.net/JSWorld/Hp4W7/32/

<div ng-repeat="division in divisions | orderBy:['group','sub']">{{division.group}}-{{division.sub}}</div>

137
orderBy:['-group','sub']per l'ordinamento groupin ordine inverso.
Dmitriy,

1
Il campo del gruppo ha la priorità di essere il primo nell'elenco OrderBy?
luchosrock,

5
@luchosrock, sì, come previsto. Giocare con il jsfiddle fornito conferma facilmente che la priorità di ordinamento è da sinistra a destra per i campi di ordinamento forniti.
Patrick Refondini,

2
Si noti che il parametro reverseOrder facoltativo non supporta un array come l'espressione param, ma è possibile ometterlo e fornire invece l'ordinamento su ciascun elemento dell'array in modo che vengano invertiti (o meno) separatamente. Esempio: orderBy: ['group', '-sub'] ordina per gruppo in modo normale, quindi per sub in ordine inverso. È possibile ottenere alcune combinazioni complesse in questo modo.
Daniel Nalbach,

1
Abbiamo simulato la priorità nel nostro negozio dando agli oggetti dell'array una proprietà booleana, quindi usandola come prima opzione. Esempio: orderBy: ['-featured', 'title'], che ha portato gli elementi reali in primo piano ad essere in alto (in ordine alfabetico), quindi il resto degli elementi elencati in ordine alfabetico.
Daniel Nalbach,


21
<select ng-model="divs" ng-options="(d.group+' - '+d.sub) for d in divisions | orderBy:['group','sub']" />

Matrice utente anziché ordine multiplo


5

L'ordinamento può essere effettuato utilizzando il filtro 'orderBy' in angolare.

Due modi: 1. Dalla vista 2. Dal controller

  1. Dalla vista

Sintassi:

{{array | orderBy : expression : reverse}} 

Per esempio:

 <div ng-repeat="user in users | orderBy : ['name', 'age'] : true">{{user.name}}</div>
  1. Dal controller

Sintassi:

$filter.orderBy(array, expression, reverse);

Per esempio:

$scope.filteredArray = $filter.orderBy($scope.users, ['name', 'age'], true);

5

Esistono 2 modi per eseguire i filtri AngularJs, uno nell'HTML che utilizza {{}} e uno nei file JS effettivi ...

Puoi risolvere il tuo problema usando:

{{ Expression | orderBy : expression : reverse}}

se lo usi in HTML o usi qualcosa del tipo:

$filter('orderBy')(yourArray, yourExpression, reverse)

Il retro è opzionale alla fine, accetta un valore booleano e, se è vero, invertirà l'array per te, un modo molto utile per invertire l'array ...


Anche qui per dare un'occhiata: docs.angularjs.org/api/ng/filter/orderBy
Alireza

0

Ho scritto questo utile pezzo per ordinare in base a più colonne / proprietà di un oggetto. Con ogni clic successivo della colonna, il codice memorizza l'ultima colonna selezionata e la aggiunge a un elenco crescente di nomi di stringhe di colonne cliccate, posizionandole in un array chiamato sortArray. Il filtro angolare "orderBy" incorporato legge semplicemente l'elenco sortArray e ordina le colonne in base all'ordine dei nomi delle colonne memorizzati. Quindi l'ultimo nome della colonna su cui si fa clic diventa il filtro ordinato principale, il precedente ha fatto clic sul successivo in precedenza, ecc. L'ordine inverso influisce sull'ordine di tutte le colonne contemporaneamente e attiva / disattiva il set di elenchi di array completo:

<script>
    app.controller('myCtrl', function ($scope) {
        $scope.sortArray = ['name'];
        $scope.sortReverse1 = false;
        $scope.searchProperty1 = '';
        $scope.addSort = function (x) {
            if ($scope.sortArray.indexOf(x) === -1) {
                $scope.sortArray.splice(0,0,x);//add to front
            }
            else {
                $scope.sortArray.splice($scope.sortArray.indexOf(x), 1, x);//remove
                $scope.sortArray.splice(0, 0, x);//add to front again
            }
        };
        $scope.sushi = [
        { name: 'Cali Roll', fish: 'Crab', tastiness: 2 },
        { name: 'Philly', fish: 'Tuna', tastiness: 2 },
        { name: 'Tiger', fish: 'Eel', tastiness: 7 },
        { name: 'Rainbow', fish: 'Variety', tastiness: 6 },
        { name: 'Salmon', fish: 'Misc', tastiness: 2 }
        ];
    });
</script>
<table style="border: 2px solid #000;">
<thead>
    <tr>
        <td><a href="#" ng-click="addSort('name');sortReverse1=!sortReverse1">NAME<span ng-show="sortReverse1==false">&#9660;</span><span ng-show="sortReverse1==true">&#9650;</span></a></td>
        <td><a href="#" ng-click="addSort('fish');sortReverse1=!sortReverse1">FISH<span ng-show="sortReverse1==false">&#9660;</span><span ng-show="sortReverse1==true">&#9650;</span></a></td>
        <td><a href="#" ng-click="addSort('tastiness');sortReverse1=!sortReverse1">TASTINESS<span ng-show="sortReverse1==false">&#9660;</span><span ng-show="sortReverse1==true">&#9650;</span></a></td>
    </tr>
</thead>
<tbody>
    <tr ng-repeat="s in sushi | orderBy:sortArray:sortReverse1 | filter:searchProperty1">
        <td>{{ s.name }}</td>
        <td>{{ s.fish }}</td>
        <td>{{ s.tastiness }}</td>
    </tr>
</tbody>
</table>

0

Creato pipe per l'ordinamento. Accetta stringhe e array di stringhe, ordinandole per più valori. Funziona per Angular (non AngularJS). Supporta sia l'ordinamento per stringa che per i numeri.

@Pipe({name: 'orderBy'})
export class OrderBy implements PipeTransform {
    transform(array: any[], filter: any): any[] {
        if(typeof filter === 'string') {
            return this.sortAray(array, filter)
        } else {
            for (var i = filter.length -1; i >= 0; i--) {
                array = this.sortAray(array, filter[i]);
            }

            return array;
        }
    }

    private sortAray(array, field) {
        return array.sort((a, b) => {
            if(typeof a[field] !== 'string') {
                a[field] !== b[field] ? a[field] < b[field] ? -1 : 1 : 0
            } else {
                a[field].toLowerCase() !== b[field].toLowerCase() ? a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 1 : 0
            }
        });
    }
}

1
PS: In realtà secondo me nessuno ha attualmente risposto alla domanda reale, perché era per Angular, non AngularJS. La mia soluzione funziona a partire da Angular 2. Testato su Angular 7.2.15
Andris,

Dovresti considerare a) quando è stata posta questa domanda eb) quando è stato annunciato Angular 2 per la prima volta.
Nick,

@andris Hai un esempio di codice end-to-end funzionante ospitato da qualche parte?
rolling stone

Siamo spiacenti, ma no :(
Andris

-8

Assicurarsi che l'ordinamento non sia complicato per l'utente finale. Ho sempre pensato che l'ordinamento per gruppo e sottogruppo fosse un po 'complicato da capire. Se si tratta di un utente finale tecnico, potrebbe essere OK.


Questo non è nemmeno un "commento" rilevante. Di sicuro non una risposta alla domanda
Afshin Moazami,

È così sbagliato chiederti se l'approccio attuale è il migliore quando fai lo sviluppo della GUI? L'esperienza dell'utente finale mi sembra rilevante
Jens Alenius,

Esistono molti scenari in cui l'ordinamento per più proprietà semplifica la comprensione dell'organizzazione da parte dell'utente. Stai essenzialmente raggruppando le cose in categorie.
Owen Johnson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.