Angular 2. How to apply orderBy?

后端 未结 4 2000
没有蜡笔的小新
没有蜡笔的小新 2020-12-03 04:13

I have a piece of code.



        
相关标签:
4条回答
  • 2020-12-03 04:21

    The most recent lib that I know

    https://www.npmjs.com/package/ngx-pipes

    const numbers = [2, 1, 3];
     
    const obj = [
      {id: 4, name: 'Dave', amount: 2},
      {id: 2, name: 'Michael', amount: 2},
      {id: 3, name: 'Dan', amount: 1},
      {id: 1, name: 'John', amount: 1}
    ];
     
    const deepObj = [
      {id: 1, name: 'John', amount: 1337, deep: {prop: 4}},
      {id: 2, name: 'Michael', amount: 42, deep: {prop: 2}},
      {id: 3, name: 'Dan', amount: 1, deep: {prop: 1}},
      {id: 4, name: 'Dave', amount: 2, deep: {prop: 3}}
    ];
    
    <!-- Returns array ordered by value -->
    <p>{{ numbers | orderBy }}</p>  <!-- Output: [1, 2, 3] -->
    <p>{{ numbers | orderBy: '-' }}</p>  <!-- Output: [3, 2, 1] -->
     
    <!-- Returns array ordered by value of property -->
    <p>{{ deepObj | orderBy: 'amount' }}</p>  
    <!-- Output: [{id: 3, ...}, {id: 4, ...}, {id: 2, ...}, {id: 1, ...}] -->
    <p>{{ deepObj | orderBy: '-amount' }}</p>  
    <!-- Output: [{id: 1, ...}, {id: 2, ...}, {id: 4, ...}, {id: 3, ...}] -->
     
    <!-- Returns array ordered by value of deep property -->
    <p>{{ deepObj | orderBy: 'deep.prop' }}</p>  
    <!-- Output: [{id: 3, ...}, {id: 2, ...}, {id: 4, ...}, {id: 1, ...}] -->
    <p>{{ deepObj | orderBy: '-deep.prop' }}</p>  
    <!-- Output: [{id: 1, ...}, {id: 4, ...}, {id: 2, ...}, {id: 3, ...}] -->
     
    <!-- Returns array ordered by mutliple properties -->
    <p>{{ obj | orderBy: ['amount', 'id'] }}</p>  
    <!-- Output: [{id: 1, ...}, {id: 3, ...}, {id: 2, ...}, {id: 4, ...}] -->
    
    0 讨论(0)
  • 2020-12-03 04:32

    You need to implement a custom pipe for this. This corresponds to create a class decorated by @Pipe. Here is a sample. Its transform method will actually handle the list and you will be able to sort it as you want:

    import { Pipe } from "angular2/core";
    
    @Pipe({
      name: "orderby"
    })
    export class OrderByPipe {
      transform(array: Array<string>, args: string): Array<string> {
        array.sort((a: any, b: any) => {
          if (a < b) {
            return -1;
          } else if (a > b) {
            return 1;
          } else {
            return 0;
          }
        });
        return array;
      }
    }
    

    You can then use this pipe as described below in expressions. For example in an ngFor. Don't forget to specify your pipe into the pipes attribute of the component where you use it:

    @Component({
      (...)
      template: `
        <li *ngFor="list | orderby"> (...) </li>
      `,
      pipes: [ OrderByPipe ]
    })
    (...)
    
    0 讨论(0)
  • 2020-12-03 04:34

    If you are using lodash your pipe can be like this:

    import { Pipe, PipeTransform } from '@angular/core';
    import { orderBy } from 'lodash';
    
    @Pipe({
      name: 'orderBy'
    })
    export class OrderByPipe implements PipeTransform {
      transform = orderBy;
    }
    

    And then you can use all the power of the method:

    <li *ngFor="let product of products | orderBy: 'price': 'desc'">
      {{product.name}}
    </li>
    
    0 讨论(0)
  • 2020-12-03 04:34

    Thank you for your answers. I have written workable code below:

    @Pipe({name: 'orderBy'})
    
    export class orderBy implements PipeTransform {
        transform(obj: any, orderFields: string): any {
            orderFields.forEach(function(currentField) {
                var orderType = 'ASC';
    
                if (currentField[0] === '-') {
                    currentField = currentField.substring(1);
                    orderType = 'DESC';
                }
    
                obj.sort(function(a, b) {
                    if (orderType === 'ASC') {
                        if (a[currentField] < b[currentField]) return -1;
                        if (a[currentField] > b[currentField]) return 1;
                        return 0;
                    } else {
                        if (a[currentField] < b[currentField]) return 1;
                        if (a[currentField] > b[currentField]) return -1;
                        return 0;
                    }
                });
    
            });
            return obj;
        }
    }

    This code consider order direction DESC or ASC. The usage:

    <tr *ngFor="#participant of participants | orderBy: '-score'; #i = index">

    0 讨论(0)
提交回复
热议问题