order Przez wiele pól w Angular


382

Jak sortować, używając wielu pól jednocześnie pod kątem? pięść według grupy, a następnie według podgrupy na przykład

$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}];

Chciałem wyświetlić to jako

grupa: podgrupa

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'" />

Odpowiedzi:


659

Zobacz to:

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

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

137
orderBy:['-group','sub']do sortowania groupw odwrotnej kolejności.
— Dmitriy

1
Czy pole grupy ma priorytet, aby być pierwszym na liście Sortuj według listy?
— luchosrock,

5
@luchosrock, tak, zgodnie z oczekiwaniami. Gra z dostarczonym jsfiddle łatwo potwierdza, że ​​priorytet sortowania jest od lewej do prawej dla podanych pól sortowania.
— Patrick Refondini

2
Zauważ, że opcjonalny parametr reverseOrder nie obsługuje tablicy, podobnie jak parametr param, ale możesz ją pominąć i zamiast tego podać porządek sortowania dla każdego elementu tablicy, aby były one odwracane (lub nie) oddzielnie. Przykład: orderBy: ['group', '-sub'] posortuje według grupy w normalny sposób, a następnie według sub w odwrotnej kolejności. W ten sposób można uzyskać złożone kombinacje.
— Daniel Nalbach,

1
W naszym sklepie zasymulowaliśmy priorytet, nadając elementom tablicy wartość boolowską, a następnie wykorzystując ją jako pierwszą opcję. Przykład: orderBy: ['-featured', 'title'], co spowodowało, że wyróżnione prawdziwe elementy znalazły się na górze (alfabetycznie), a następnie pozostałe elementy wymienione alfabetycznie.
— Daniel Nalbach,


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

Tablica użytkownika zamiast wielu zamówień BY


5

Sortowania można dokonać za pomocą filtra „orderBy” w układzie kątowym.

Dwa sposoby: 1. Z widoku 2. Z kontrolera

  1. Z widoku

Składnia:

{{array | orderBy : expression : reverse}} 

Na przykład:

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

Składnia:

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

Na przykład:

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

5

Istnieją dwa sposoby wykonywania filtrów AngularJs, jeden w HTML przy użyciu {{}} i jeden w rzeczywistych plikach JS ...

Możesz rozwiązać problem za pomocą:

{{ Expression | orderBy : expression : reverse}}

jeśli użyjesz go w HTML lub użyjesz czegoś takiego:

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

Odwrotność jest opcjonalna na końcu, przyjmuje wartość logiczną, a jeśli to prawda, odwróci tablicę dla ciebie, bardzo przydatny sposób na odwrócenie tablicy ...


Również tutaj, aby zobaczyć: docs.quarejs.org/api/ng/filter/orderBy
— Alireza

0

Napisałem ten przydatny kawałek do sortowania według wielu kolumn / właściwości obiektu. Przy każdym kolejnym kliknięciu kolumny kod przechowuje ostatnią klikniętą kolumnę i dodaje ją do rosnącej listy nazw ciągów klikanych kolumn, umieszczając je w tablicy o nazwie sortArray. Wbudowany filtr Angular „orderBy” po prostu odczytuje listę sortArray i porządkuje kolumny według kolejności przechowywanych tam nazw kolumn. Tak więc ostatnia kliknięta nazwa kolumny staje się filtrem pierwotnie uporządkowanym, poprzedni kliknął następny z pierwszeństwem itp. Odwrotna kolejność wpływa na kolejność wszystkich kolumn jednocześnie i przełącza rosnąco / malejąco dla kompletnego zestawu list tablic:

<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

Utworzono rurę do sortowania. Akceptuje zarówno ciąg znaków, jak i tablicę ciągów, sortując według wielu wartości. Działa dla Angular (nie AngularJS). Obsługuje zarówno sortowanie według ciągów, jak i liczb.

@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: Właściwie to moim zdaniem nikt obecnie nie odpowiedział na aktualne pytanie, ponieważ dotyczyło to Angulara, a nie AngularJS. Moje rozwiązanie działa od wersji Angular 2. Testowane na wersji Angular 7.2.15
— Andris

Powinieneś rozważyć a) kiedy zadano to pytanie, oraz b) kiedy po raz pierwszy ogłoszono Angular 2.
— Nick

@ andris Czy masz gdzieś działający przykład kodu od końca do końca hostowany?
— Rolling Stone

Przepraszamy, ale nie :(
— Andris

-8

Upewnij się, że sortowanie nie jest skomplikowane dla użytkownika końcowego. Zawsze myślałem, że sortowanie według grup i podgrup jest trochę skomplikowane do zrozumienia. Jeśli jest to techniczny użytkownik końcowy, może być OK.


To nie jest nawet odpowiedni „komentarz”. Na pewno nie odpowiedź na pytanie
— Afshin Moazami

Czy tak źle jest zadawać sobie pytanie, czy obecne podejście jest najlepsze przy tworzeniu GUI? Doświadczenie użytkownika końcowego wydaje mi się istotne
— Jens Alenius

Istnieje wiele scenariuszy, w których sortowanie według wielu właściwości ułatwia użytkownikowi zrozumienie organizacji. Zasadniczo grupujesz rzeczy w kategorie.
— Owen Johnson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.