0

I have an array of products:

public sort_criteria: any='';

public products: any = [
{title: 'Product_1', desc: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry', img: '../assets/prod_1.jpg', property_1: 50, property_2: 6, property_3: 0, property_4: 76, property_5: 54, property_6: 87, property_7: 0},
{title: 'Product_2', desc: 'Lorem Ipsum has been the industrys standard dummy text ever since the 1500s', img: '../assets/prod_2.jpg', property_1: 0, property_2: 0, property_3: 65, property_4: 0, property_5: 0, property_6: 7, property_7: 88},
{title: 'Product_3', desc: 'It has survived not only five centuries but also the leap into electronic typesetting', img: '../assets/prod_3.jpg', property_1: 0, property_2: 97, property_3: 0, property_4: 56, property_5: 0, property_6: 0, property_7: 86},
{title: 'Product_4', desc: ' It was popularised in the 1960s with the release of Letraset sheets containing,', img: '../assets/prod_4.jpg', property_1: 90, property_2: 25, property_3: 56, property_4: 64, property_5: 0, property_6: 98, property_7: 0},
]

public sort_according_to: any=['Product 1', 'Product 2', 'Product 3', 'Product 4']

setSortCriteria(criteria){

    switch (criteria) {
        case "Product 1":
        alert(3)
        break;
        case "Product 2":
        alert(2)
        break;
        case "Product 3":
        alert(3)
        break;
        case "Product 4":
        alert(4)
        break;      
        default:
        break;
    }
}

My user will select one of the properties from 7 properties and whatever property he selects my products should be sorted in descending oder of that property i.e. if he selects Property 1 then my sequence of my products will be 4,1,2,3.

My HTML:

  <h5>Sort products according to the popularity of</h5>

  <div *ngFor="let product of sort_according_to">
    <mdl-radio name="productgroup" [value]='product' [(ngModel)]="sort_criteria" (change)="setSortCriteria(product)"> {{product}} </mdl-radio>
  </div>


  <mdl-card *ngFor="let product of products" class="demo-card-square" mdl-shadow="2">
    <figure class="mdl-card__media">
      <img src="{{product.img}}" alt="" />
    </figure>
    <mdl-card-title mdl-card-expand>
      <h2 mdl-card-title-text>{{product.title}}</h2><br>
    </mdl-card-title>

    <mdl-card-supporting-text>
      {{product.desc}}
    </mdl-card-supporting-text>
    <mdl-card-actions mdl-card-border>
      <button mdl-button mdl-colored mdl-ripple (click)="openProductDetails()">
        view
      </button>
      <div class="mdl-layout-spacer"></div>
      <button class="mdl-button mdl-button--icon mdl-button--colored" (click)="addToCart(product)"><i class="material-icons">shopping_cart</i></button>
    </mdl-card-actions>
  </mdl-card>

How can I implement a pipe in that case?

4
  • how do you determine the order in your example not be 4, 1, 3, 2 instead of 4, 1, 2, 3 ? (since the property_1 value for both 2 & 3 are '0') Commented Oct 4, 2017 at 14:25
  • In that case just by the index of the product Commented Oct 4, 2017 at 14:26
  • ascending or descending index (since you were looking for a descending order) ? I guess it doesn't matter Commented Oct 4, 2017 at 14:27
  • Yes it doesn't matter Commented Oct 4, 2017 at 14:29

1 Answer 1

2

You can pass the array & a sorting property into a pipe. The pipe can then sort the array by that property.

// component.html
<mdl-card *ngFor="let product of products | sortArrayByProperty : sort_criteria">
</mdl-card>

//pipe.ts
@Pipe({
    name: 'sortArrayByProperty'
})
export class SortArrayByPropertyPipe implements PipeTransform {
    transform(arr: any[]: property: string): any[] {
        // basic sort by property method
        return arr.sort((a, b) => b[property] - a[property]);
    }
}

Here is a basic working plnkr https://plnkr.co/edit/XgzkljALx2cEHWLSGOTs?p=preview

Sign up to request clarification or add additional context in comments.

1 Comment

Exactly this is what I was looking for, thanks a lot!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.