ऑर्डरबी पाइप मुद्दा


97

मैं इस कोड को Angualr 1 से Angular 2 में अनुवाद करने में सक्षम नहीं हूं:

ng-repeat="todo in todos | orderBy: 'completed'"

यह वही है जो मैंने थियरी टेम्पलर के उत्तर के बाद किया है:

घटक टेम्पलेट:

*ngFor="#todo of todos | sort"

घटक कोड:

@Component({
    selector: 'my-app',
    templateUrl: "./app/todo-list.component.html",
    providers: [TodoService],
    pipes: [ TodosSortPipe ]

})

पाइप कोड:

import { Pipe } from "angular2/core";
import {Todo} from './todo';

@Pipe({
  name: "sort"
})
export class TodosSortPipe {
  transform(array: Array<Todo>, args: string): Array<Todo> {
    array.sort((a: any, b: any) => {
      if (a < b) {
        return -1;
      } else if (a > b) {
        return 1;
      } else {
        return 0;
      }
    });
    return array;
  }
}

मैं Todoसंपत्ति द्वारा आदेश दिया गया एक सरणी सॉर्ट करने का प्रयास कर रहा हूं completed। पहले todo.completed = falseऔर फिर द todo.complete = true

मैं बहुत अच्छी तरह से transformविधि और उस विधि में और विधि में तर्क पारित करने के लिए कैसे समझ में नहीं आता sort

args: stringतर्क क्या है ? क्या हैं aऔर bवे कहाँ से आते हैं?


मुझे यह मॉड्यूल पैकेज Angular5 + वर्जन freakyjolly.com/- के लिए ऑर्डरबी के लिए मिला
कोड जासूस

जवाबों:


78

मैंने @ थियरी टेम्प्लियर की प्रतिक्रिया को संशोधित किया ताकि पाइप कोणीय 4 में कस्टम ऑब्जेक्ट्स को सॉर्ट कर सकें:

import { Pipe, PipeTransform } from "@angular/core";

@Pipe({
  name: "sort"
})
export class ArraySortPipe  implements PipeTransform {
  transform(array: any, field: string): any[] {
    if (!Array.isArray(array)) {
      return;
    }
    array.sort((a: any, b: any) => {
      if (a[field] < b[field]) {
        return -1;
      } else if (a[field] > b[field]) {
        return 1;
      } else {
        return 0;
      }
    });
    return array;
  }
}

और इसका उपयोग करने के लिए:

*ngFor="let myObj of myArr | sort:'fieldName'"

उम्मीद है कि यह किसी की मदद करता है।


1
मुझे संदेश मिल गया है The pipe 'sort' could not be found:। क्या मैं किसी भी तरह अपने घटक में पाइप को कोणीय 2 पाइपों में इंजेक्ट कर सकता हूं: [ArraySortPipe]?
Matija 17upančić

अपने ऐप कंपोनेंट में पाइप को इंजेक्ट करने के तरीके पर @Thryry Templier प्रतिक्रिया देखें
Sal

आपको अपने मॉड्यूल पदानुक्रम घोषणाओं में "ArraySortPipe" शामिल करने की आवश्यकता है। कुछ इस तरह: आयात {ArraySortPipe} से './../../sared/filters.pipe'; 'App.module.ts' और इसके तहत किसी भी मॉड्यूल में। डाल: घोषणाएँ: [ArraySortPipe]
डूडी

71

पूर्ण चर्चा के लिए कृपया https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe देखें । यह उद्धरण सबसे अधिक प्रासंगिक है। मूल रूप से, बड़े पैमाने पर ऐप्स के लिए जिन्हें आक्रामक रूप से छोटा किया जाना चाहिए और फ़िल्टरिंग और सॉर्टिंग लॉजिक को घटक को ही स्थानांतरित करना चाहिए।

"हम में से कुछ इस आक्रामक तरीके से छोटा करने की परवाह नहीं कर सकते हैं। यह हमारी पसंद है। लेकिन कोणीय उत्पाद को किसी और को आक्रामक रूप से खनन करने से नहीं रोकना चाहिए। इसलिए, कोणीय टीम ने फैसला किया कि कोणीय में भेजी गई हर चीज सुरक्षित रूप से पुष्टि करेगी।

कोणीय टीम और कई अनुभवी कोणीय डेवलपर्स दृढ़ता से अनुशंसा करते हैं कि आप घटक में ही फ़िल्टरिंग और सॉर्टिंग तर्क को स्थानांतरित करें। घटक फ़िल्टर किए गए हेरो या सॉर्टहेड गुण को उजागर कर सकता है और सहायक तर्क को निष्पादित करने के लिए कब और कितनी बार नियंत्रण कर सकता है। कोई भी क्षमता जिसे आपने एक पाइप में डाला होगा और ऐप में साझा किया जाएगा, उसे फ़िल्टरिंग / सॉर्टिंग सेवा में लिखा जा सकता है और घटक में इंजेक्ट किया जा सकता है। ”


7
आपको तर्क को "घटक में ही" कैसे स्थानांतरित करना चाहिए जो "सहायक तर्क को निष्पादित करने के लिए कब और कितनी बार नियंत्रण कर सकता है"? क्या इसके अच्छे उदाहरण हैं?
मज्जिज्ज़

1
@Mzzzzzz जहां यह एक संपत्ति का उल्लेख कर रहा है जैसे filteredHeroesऔर sortedHeroes, मुझे लगता है कि यह विचार है कि घटक को शुरू करते समय आप कुछ छंटाई / फ़िल्टरिंग तर्क (शायद ngOnInit से एक विधि कह रहे हैं) चलाएंगे, फिर उस संपत्ति को हल / फ़िल्टर परिणामों के साथ सेट करें और केवल तर्क को फिर से चलाएं / संपत्ति को अपडेट करें यदि कोई ऐसी चीज है जो एक आवश्यकता को ट्रिगर करती है (जैसे उपयोगकर्ता इंटरैक्शन अधिक नायकों को प्राप्त करने के लिए AJAX कॉल को ट्रिगर करता है, या उपयोगकर्ता कुछ मानदंडों के आधार पर उनमें से आधे को दूर करने के लिए एक चेकबॉक्स क्लिक करता है)
jmq

41

आप इसके लिए एक कस्टम पाइप लागू कर सकते हैं जो sortसरणियों की विधि का लाभ उठाता है :

import { Pipe } from "angular2/core";

@Pipe({
  name: "sort"
})
export class ArraySortPipe {
  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;
  }
}

और फिर नीचे बताए अनुसार इस पाइप का उपयोग करें। pipesघटक की विशेषता में अपने पाइप को निर्दिष्ट करने के लिए मत भूलना :

@Component({
  (...)
  template: `
    <li *ngFor="list | sort"> (...) </li>
  `,
  pipes: [ ArraySortPipe ]
})
(...)

यह स्ट्रिंग मानों के साथ सरणियों के लिए एक सरल नमूना है, लेकिन आपके पास कुछ उन्नत सॉर्टिंग प्रसंस्करण (ऑब्जेक्ट सरणी के मामले में ऑब्जेक्ट विशेषताओं के आधार पर, सॉर्टिंग पैरामीटर, ... के आधार पर) हो सकता है।

इसके लिए यहां एक प्लंक्र है: https://plnkr.co/edit/WbzqDDOqN1oAhvqMkQRQ?p=preview

आशा है कि यह आपकी मदद करता है, थियरी


1
उत्तर देने के लिए धन्यवाद, क्या आप सॉर्ट विधि की व्याख्या कर सकते हैं?

1
वास्तव में sortविधि जावास्क्रिप्ट Arrayवस्तु का एक तरीका है । यह लिंक देखें: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
थिएरी टेम्पलियर

ठीक है, मुझे मिल गया, यह तर्क के रूप में तुलनात्मक फ़ंक्शन के साथ जावास्क्रिप्ट सॉर्ट विधि का उपयोग करता है। धन्यवाद!

1
दुर्भाग्य से प्लंकर को हटा दिया गया है। थियरी?

4
pipes: [..]घोषणा अब मान्य नहीं (और अब आवश्यक हो तो) है
phil294

9

अपडेट किए गए ऑर्डरबाइप: अपडेट किए गए तार नहीं छंटे।

एक ऑर्डरबाइप क्लास बनाएँ:

import { Pipe, PipeTransform } from "@angular/core";
@Pipe( {
name: 'orderBy'
} )
export class OrderByPipe implements PipeTransform {
transform( array: Array<any>, orderField: string, orderType: boolean ): Array<string> {
    array.sort( ( a: any, b: any ) => {
        let ae = a[ orderField ];
        let be = b[ orderField ];
        if ( ae == undefined && be == undefined ) return 0;
        if ( ae == undefined && be != undefined ) return orderType ? 1 : -1;
        if ( ae != undefined && be == undefined ) return orderType ? -1 : 1;
        if ( ae == be ) return 0;
        return orderType ? (ae.toString().toLowerCase() > be.toString().toLowerCase() ? -1 : 1) : (be.toString().toLowerCase() > ae.toString().toLowerCase() ? -1 : 1);
    } );
    return array;
  }
}

आपके नियंत्रक में:

@Component({
pipes: [OrderByPipe]
})

या अपने में

 declarations: [OrderByPipe]

अपने HTML में:

<tr *ngFor="let obj of objects | orderBy : ObjFieldName: OrderByType">

ObjFieldName: ऑब्जेक्ट फ़ील्ड नाम जिसे आप सॉर्ट करना चाहते हैं;

ऑर्डरबाइट: बूलियन; सच: अवरोही क्रम; असत्य: आरोही;


एक [ऑर्डरफ़िल्ड] - b [ऑर्डरफ़िल्ड] की तुलना करने वाले स्ट्रिंग तर्कों के लिए NaN
Piotr P 4czek

तारीख के तर्क के लिए यह काम नहीं करता है। पाठ के रूप में दिनांक स्वरूप गलत आदेश दिया जाएगा।
राफेल पिजाओ

9

कोणीय बॉक्स से बाहर एक आदेश फ़िल्टर के साथ नहीं आता है, लेकिन अगर हम तय करते हैं कि हमें एक की आवश्यकता है तो हम आसानी से एक बना सकते हैं। हालाँकि कुछ कैविएट हैं जिन्हें हमें गति और मिनिफिकेशन के साथ करने के लिए जागरूक होने की आवश्यकता है। निचे देखो।

एक साधारण पाइप कुछ इस तरह दिखेगा।

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'sort'
})
export class SortPipe implements PipeTransform {
  transform(ary: any, fn: Function = (a,b) => a > b ? 1 : -1): any {
    return ary.sort(fn)
  }
}

यह पाइप एक प्रकार्य फ़ंक्शन ( fn) को स्वीकार करता है , और इसे एक डिफ़ॉल्ट मान देता है जो एक समझदार तरीके से प्राथमिकताओं की एक सरणी को सॉर्ट करेगा। यदि हम चाहें तो हमारे पास इस प्रकार के कार्य को ओवरराइड करने का विकल्प है।

यह एक विशेषता नाम को एक स्ट्रिंग के रूप में स्वीकार नहीं करता है, क्योंकि विशेषता नाम मीनकरण के अधीन हैं। जब हम अपने कोड को छोटा करेंगे, तो वे बदल जाएंगे, लेकिन टेम्प्लेट स्ट्रिंग में मान को छोटा करने के लिए मिनिफ़ायर पर्याप्त स्मार्ट नहीं हैं।

छँटाई आदिम (संख्या और तार)

हम इसका उपयोग डिफ़ॉल्ट तुलनित्र का उपयोग करके संख्या या स्ट्रिंग्स की एक सरणी को सॉर्ट करने के लिए कर सकते हैं:

import { Component } from '@angular/core';

@Component({
  selector: 'cat',
  template: `
    {{numbers | sort}}
    {{strings | sort}}
  `
})
export class CatComponent
  numbers:Array<number> = [1,7,5,6]
  stringsArray<string> = ['cats', 'hats', 'caveats']
}

वस्तुओं की एक सरणी छाँटना

यदि हम वस्तुओं की एक सरणी को क्रमबद्ध करना चाहते हैं, तो हम इसे एक तुलनित्र कार्य दे सकते हैं।

import { Component } from '@angular/core';

@Component({
  selector: 'cat',
  template: `
    {{cats | sort:byName}}
  `
})
export class CatComponent
  cats:Array<Cat> = [
    {name: "Missy"},
    {name: "Squoodles"},
    {name: "Madame Pompadomme"}
  ]
  byName(a,b) {
    return a.name > b.name ? 1 : -1
  }
}

कैविट्स - शुद्ध बनाम अशुद्ध पाइप

कोणीय 2 में शुद्ध और अशुद्ध पाइप की अवधारणा है।

एक शुद्ध पाइप वस्तु पहचान का उपयोग करके परिवर्तन का पता लगाने का अनुकूलन करता है। इसका मतलब है कि पाइप केवल तभी चलेगा जब इनपुट ऑब्जेक्ट पहचान बदलता है, उदाहरण के लिए यदि हम सरणी में एक नया आइटम जोड़ते हैं। यह वस्तुओं में नहीं उतरेगा। इसका मतलब है कि अगर हम एक नेस्टेड विशेषता को बदलते हैं: this.cats[2].name = "Fluffy"उदाहरण के लिए, पाइप फिर से नहीं चलेगा। इससे कोणीय तेज होने में मदद मिलती है। कोणीय पाइप डिफ़ॉल्ट रूप से शुद्ध होते हैं।

दूसरी ओर एक अशुद्ध पाइप ऑब्जेक्ट विशेषताओं की जांच करेगा। यह संभावित रूप से इसे बहुत धीमा बनाता है। क्योंकि यह गारंटी नहीं दे सकता है कि पाइप फ़ंक्शन क्या करेगा (शायद यह उदाहरण के लिए दिन के समय के आधार पर अलग-अलग क्रमबद्ध होता है), एक अशुद्ध पाइप हर बार एक अतुल्यकालिक घटना होती है। यदि सरणी बड़ी है, तो यह आपके ऐप को काफी धीमा कर देगा।

ऊपर का पाइप शुद्ध है। इसका मतलब है कि यह केवल तभी चलेगा जब सरणी में ऑब्जेक्ट अपरिवर्तनीय हों। यदि आप एक बिल्ली बदलते हैं, तो आपको पूरी बिल्ली ऑब्जेक्ट को एक नए के साथ बदलना होगा।

this.cats[2] = {name:"Tomy"}

हम शुद्ध विशेषता सेट करके एक अशुद्ध पाइप को बदल सकते हैं:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'sort',
  pure: false
})
export class SortPipe implements PipeTransform {
  transform(ary: any, fn: Function = (a,b) => a > b ? 1 : -1): any {
    return ary.sort(fn)
  }
}

यह पाइप वस्तुओं में उतरेगा, लेकिन धीमा होगा। सावधानी से प्रयोग करें।


धन्यवाद .. बहुत मदद की। लेकिन एक सवाल .. अगर हमें छंटाई के लिए पाइप या फिल्टर का उपयोग नहीं करना चाहिए, तो सबसे अच्छा तरीका क्या है? मैंने हर जगह खोजा, हर कोई पाइप बनाकर समाधान दे रहा है।
पावन शुक्ल

@PavanSukla आप एक पाइप का उपयोग कर सकते हैं, बस सुनिश्चित करें कि आपकी सरणी प्रविष्टियाँ अपरिवर्तनीय हैं और एक शुद्ध पाइप बना सकते हैं। या, यदि आपके पास एक बड़ा सरणी नहीं है, तो एक अशुद्ध पाइप बनाएं और प्रत्येक रेंडर को सॉर्ट करें। वैकल्पिक रूप से, अपने घटक की विशेषता के रूप में एक क्रमबद्ध सरणी बनाएं और इसे प्रस्तुत करें।
सुपरलाइनरी

मैंने प्रत्येक क्लाउड हेडिंग के क्लिक पर array.sort लॉजिक का उपयोग किया है। मैं प्रदर्शन डेटा सरणी पर यह ऑपरेशन कर रहा हूं .. क्या यह अच्छा तरीका है?
पवन शुक्ला

7

मैंने एक ऑर्डरबाय पाइप बनाया है जो आपकी ज़रूरत के हिसाब से काम करता है। यह वस्तुओं के एक स्तंभ के साथ-साथ कई स्तंभों को छाँटने में सक्षम होने का समर्थन करता है।

<li *ngFor="#todo in todos | orderBy : ['completed']">{{todo.name}} {{todo.completed}}</li>

यह पाइप पृष्ठ को रेंडर करने के बाद सरणी में अधिक आइटम जोड़ने की अनुमति देता है, और सरणी को गतिशील रूप से अपडेट करेगा।

मैं यहाँ प्रक्रिया पर एक लिखना है

और यहाँ एक कार्यशील डेमो है: http://fuelinteractive.github.io/fuel-ui/#/pipe/orderby और https://plnkr.co/edit/DHLVc0?p=info


आप अशक्त मूल्यों को नहीं संभाल रहे हैं।
अली हबीबजादे

if (a == null) a = 0; if (b == null) b = 0;
अली हबीबजादे

समान मान के साथ मान भी उछल-
कूद

@XGreen इसके लिए धन्यवाद। मैं ईंधन-उई के अगले अद्यतन में अशक्त / अपरिभाषित मूल्यों के लिए समर्थन जोड़ रहा हूँ। समान मूल्यों की छलांग के लिए, मैं यह नहीं देख रहा हूं। आप कौन सा ब्राउज़र उपयोग कर रहे हैं?
Cory Shaw

Chrome संस्करण 50.0.2661.86 (64-बिट), OSX El Capitan
अली हबीबज़ादे

4

कोणीय के साथ यू का उपयोग करें, तो आपका पाइप अगला होगा:

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

    transform(array: Array<any>, args?: any): any {
        return _.sortBy(array, [args]);
    }

}

और html में इसका उपयोग करें

*ngFor = "#todo of todos | orderBy:'completed'"

और अपने मॉड्यूल में पाइप जोड़ना न भूलें

@NgModule({
    ...,
    declarations: [OrderByPipe, ...],
    ...
})

मुझे आपका दृष्टिकोण पसन्द आया
एरिक

1
_.SortBy का उपयोग करने की समस्या यह है कि आप अवरोही क्रम को निर्दिष्ट नहीं कर सकते। मैंने पाया है कि _.order का उपयोग करके आप हर क्षेत्र के लिए कस्टम ऑर्डर निर्दिष्ट कर सकते हैं। अर्थात: _.ऑर्डरबाई (सरणी, ['फ़ील्ड 1', 'फ़ील्ड 2'], ['एस्क', 'डीएससी'])
एरिक

3

यह आपके पास से गुजरने वाले किसी भी क्षेत्र के लिए काम करेगा। ( महत्वपूर्ण: यह केवल वर्णानुक्रम में आदेश देगा ताकि यदि आप कोई दिनांक पास करते हैं तो यह इसे वर्णमाला के रूप में आदेश देगा क्योंकि तिथि नहीं है)

/*
 *      Example use
 *      Basic Array of single type: *ngFor="let todo of todoService.todos | orderBy : '-'"
 *      Multidimensional Array Sort on single column: *ngFor="let todo of todoService.todos | orderBy : ['-status']"
 *      Multidimensional Array Sort on multiple columns: *ngFor="let todo of todoService.todos | orderBy : ['status', '-title']"
 */

import {Pipe, PipeTransform} from "@angular/core";

@Pipe({name: "orderBy", pure: false})
export class OrderByPipe implements PipeTransform {

    value: string[] = [];

    static _orderByComparator(a: any, b: any): number {

        if (a === null || typeof a === "undefined") { a = 0; }
        if (b === null || typeof b === "undefined") { b = 0; }

        if (
            (isNaN(parseFloat(a)) ||
            !isFinite(a)) ||
            (isNaN(parseFloat(b)) || !isFinite(b))
        ) {
            // Isn"t a number so lowercase the string to properly compare
            a = a.toString();
            b = b.toString();
            if (a.toLowerCase() < b.toLowerCase()) { return -1; }
            if (a.toLowerCase() > b.toLowerCase()) { return 1; }
        } else {
            // Parse strings as numbers to compare properly
            if (parseFloat(a) < parseFloat(b)) { return -1; }
            if (parseFloat(a) > parseFloat(b)) { return 1; }
        }

        return 0; // equal each other
    }

    public transform(input: any, config = "+"): any {
        if (!input) { return input; }

        // make a copy of the input"s reference
        this.value = [...input];
        let value = this.value;
        if (!Array.isArray(value)) { return value; }

        if (!Array.isArray(config) || (Array.isArray(config) && config.length === 1)) {
            let propertyToCheck: string = !Array.isArray(config) ? config : config[0];
            let desc = propertyToCheck.substr(0, 1) === "-";

            // Basic array
            if (!propertyToCheck || propertyToCheck === "-" || propertyToCheck === "+") {
                return !desc ? value.sort() : value.sort().reverse();
            } else {
                let property: string = propertyToCheck.substr(0, 1) === "+" || propertyToCheck.substr(0, 1) === "-"
                    ? propertyToCheck.substr(1)
                    : propertyToCheck;

                return value.sort(function(a: any, b: any) {
                    let aValue = a[property];
                    let bValue = b[property];

                    let propertySplit = property.split(".");

                    if (typeof aValue === "undefined" && typeof bValue === "undefined" && propertySplit.length > 1) {
                        aValue = a;
                        bValue = b;
                        for (let j = 0; j < propertySplit.length; j++) {
                            aValue = aValue[propertySplit[j]];
                            bValue = bValue[propertySplit[j]];
                        }
                    }

                    return !desc
                        ? OrderByPipe._orderByComparator(aValue, bValue)
                        : -OrderByPipe._orderByComparator(aValue, bValue);
                });
            }
        } else {
            // Loop over property of the array in order and sort
            return value.sort(function(a: any, b: any) {
                for (let i = 0; i < config.length; i++) {
                    let desc = config[i].substr(0, 1) === "-";
                    let property = config[i].substr(0, 1) === "+" || config[i].substr(0, 1) === "-"
                        ? config[i].substr(1)
                        : config[i];

                    let aValue = a[property];
                    let bValue = b[property];

                    let propertySplit = property.split(".");

                    if (typeof aValue === "undefined" && typeof bValue === "undefined" && propertySplit.length > 1) {
                        aValue = a;
                        bValue = b;
                        for (let j = 0; j < propertySplit.length; j++) {
                            aValue = aValue[propertySplit[j]];
                            bValue = bValue[propertySplit[j]];
                        }
                    }

                    let comparison = !desc
                        ? OrderByPipe._orderByComparator(aValue, bValue)
                        : -OrderByPipe._orderByComparator(aValue, bValue);

                    // Don"t return 0 yet in case of needing to sort by next property
                    if (comparison !== 0) { return comparison; }
                }

                return 0; // equal each other
            });
        }
    }
}

क्या आप एक उपयोग उदाहरण पोस्ट कर सकते हैं?
theUnreal

मैं आपके द्वारा प्रदान किए गए कोड को संकलित नहीं कर सकता। मुझे यह कहते हुए एक त्रुटि मिलती है कि संपत्ति @Componentनहीं है pipes
अज़ीमुथ

3

यह कोणीय 4 में एंगुलरज ऑर्डरबी पाइप के लिए अच्छा प्रतिस्थापन है । प्रयोग करने में आसान और सरल।

यह अधिक जानकारी https://github.com/VadimDez/ngx-order-pipe के लिए github URL है

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'orderBy'
})
export class OrderPipe implements PipeTransform {

  transform(value: any | any[], expression?: any, reverse?: boolean): any {
    if (!value) {
      return value;
    }

    const isArray = value instanceof Array;

    if (isArray) {
      return this.sortArray(value, expression, reverse);
    }

    if (typeof value === 'object') {
      return this.transformObject(value, expression, reverse);
    }

    return value;
  }

  /**
   * Sort array
   *
   * @param value
   * @param expression
   * @param reverse
   * @returns {any[]}
   */
  private sortArray(value: any[], expression?: any, reverse?: boolean): any[] {
    const isDeepLink = expression && expression.indexOf('.') !== -1;

    if (isDeepLink) {
      expression = OrderPipe.parseExpression(expression);
    }

    let array: any[] = value.sort((a: any, b: any): number => {
      if (!expression) {
        return a > b ? 1 : -1;
      }

      if (!isDeepLink) {
        return a[expression] > b[expression] ? 1 : -1;
      }

      return OrderPipe.getValue(a, expression) > OrderPipe.getValue(b, expression) ? 1 : -1;
    });

    if (reverse) {
      return array.reverse();
    }

    return array;
  }


  /**
   * Transform Object
   *
   * @param value
   * @param expression
   * @param reverse
   * @returns {any[]}
   */
  private transformObject(value: any | any[], expression?: any, reverse?: boolean): any {
    let parsedExpression = OrderPipe.parseExpression(expression);
    let lastPredicate = parsedExpression.pop();
    let oldValue = OrderPipe.getValue(value, parsedExpression);

    if (!(oldValue instanceof Array)) {
      parsedExpression.push(lastPredicate);
      lastPredicate = null;
      oldValue = OrderPipe.getValue(value, parsedExpression);
    }

    if (!oldValue) {
      return value;
    }

    const newValue = this.transform(oldValue, lastPredicate, reverse);
    OrderPipe.setValue(value, newValue, parsedExpression);
    return value;
  }

  /**
   * Parse expression, split into items
   * @param expression
   * @returns {string[]}
   */
  private static parseExpression(expression: string): string[] {
    expression = expression.replace(/\[(\w+)\]/g, '.$1');
    expression = expression.replace(/^\./, '');
    return expression.split('.');
  }

  /**
   * Get value by expression
   *
   * @param object
   * @param expression
   * @returns {any}
   */
  private static getValue(object: any, expression: string[]) {
    for (let i = 0, n = expression.length; i < n; ++i) {
      const k = expression[i];
      if (!(k in object)) {
        return;
      }
      object = object[k];
    }

    return object;
  }

  /**
   * Set value by expression
   *
   * @param object
   * @param value
   * @param expression
   */
  private static setValue(object: any, value: any, expression: string[]) {
    let i;
    for (i = 0; i < expression.length - 1; i++) {
      object = object[expression[i]];
    }

    object[expression[i]] = value;
  }
}

2

जैसा कि हम जानते हैं कि फ़िल्टर और आदेश ANGULAR 2 से हटा दिए गए हैं और हमें अपना स्वयं का लिखना आवश्यक है, यहाँ प्लंकर और विस्तृत लेख पर एक अच्छा उदाहरण है

यह दोनों फिल्टर के साथ-साथ ऑर्डरबी का उपयोग करता था, यहां ऑर्डर पाइप के लिए कोड है

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

  transform(records: Array<any>, args?: any): any {       
    return records.sort(function(a, b){
          if(a[args.property] < b[args.property]){
            return -1 * args.direction;
          }
          else if( a[args.property] > b[args.property]){
            return 1 * args.direction;
          }
          else{
            return 0;
          }
        });
    };
 }

2

आप वस्तुओं के लिए इसका उपयोग कर सकते हैं:

@Pipe({
  name: 'sort',
})
export class SortPipe implements PipeTransform {

  transform(array: any[], field: string): any[] {
    return array.sort((a, b) => a[field].toLowerCase() !== b[field].toLowerCase() ? a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 1 : 0);
  }

}

2

Package.json में, कुछ ऐसा जोड़ें (यह संस्करण कोणीय 2 के लिए ठीक है):

  "ngx-order-pipe": "^1.1.3",

आपके टाइपस्क्रिप्ट मॉड्यूल में (और आयात सरणी):

  import { OrderModule } from 'ngx-order-pipe';

1
<!-- const cars=['Audi','Merc','BMW','Volvo','Tesla'] -->

<ul>
  <li *ngFor="let car of cars">{{car}}</li>
</ul>


/*
 *ngFor="let c of oneDimArray | sortBy:'asc'"
 *ngFor="let c of arrayOfObjects | sortBy:'asc':'propertyName'"
*/
import { Pipe, PipeTransform } from '@angular/core';
import { orderBy } from 'lodash';

@Pipe({ name: 'sortBy' })
export class SortByPipe implements PipeTransform {

  transform(value: any[], order = '', column: string = ''): any[] {
    if (!value || order === '' || !order) { return value; } // no array
    if (!column || column === '') { return sortBy(value); } // sort 1d array
    if (value.length <= 1) { return value; } // array with only one item
    return orderBy(value, [column], [order]);
  }
}

1
धन्यवाद, शानदार जवाब
एएम - ईवीएस

0

Angular2 के वर्तमान संस्करण में, ऑर्डरबाय और ArraySort पाइप समर्थित नहीं हैं। आपको इसके लिए कुछ कस्टम पाइप लिखने / उपयोग करने की आवश्यकता है।


0

कोणीय 5+ संस्करण के लिए हम एनजीएक्स-ऑर्डर-पाइप पैकेज का उपयोग कर सकते हैं

स्रोत ट्यूटोरियल लिंक

पैकेज स्थापित करे

$ npm install ngx-order-pipe --save

एप्लिकेशन मॉड्यूल में आयात करें

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { OrderModule } from 'ngx-order-pipe';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    OrderModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

कहीं भी उपयोग करें

  <ul>
    <li *ngFor="let item of (dummyData | orderBy:'name') ">
      {{item.name}}
    </li>
  </ul>

0

Angular JS में ऑर्डरबी पाइप सपोर्ट करेगा लेकिन Angular (उच्च संस्करण) सपोर्ट नहीं करेगा । कृपया पाएं कि उन्होंने प्रदर्शन की गति बढ़ाने के लिए चर्चा की है।

https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe


-1
Component template:
todos| sort: ‘property’:’asc|desc’

Pipe code:

import { Pipe,PipeTransform  } from "angular/core";
import {Todo} from './todo';

@Pipe({
  name: "sort"
})
export class TodosSortPipe implements PipeTransform {
  transform(array: Array<Todo>, args: string): Array<Todo> {
    array.sort((a: any, b: any) => {
      if (a < b) {
        return -1;
      } else if (a > b) {
        return 1;
      } else {`enter code here`
        return 0;
      }
    });
    return array;
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.