Angularには箱から出してすぐにorderByフィルターが付属していませんが、必要な場合は簡単に作成できます。ただし、速度と最小化に関して行う必要があるいくつかの注意点があります。下記参照。
単純なパイプは次のようになります。
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
}
}
警告-純粋なパイプと不純なパイプ
Angular 2には、純粋なパイプと不純なパイプの概念があります。
純粋なパイプは、オブジェクトIDを使用して変更検出を最適化します。つまり、新しいオブジェクトを配列に追加した場合など、入力オブジェクトがIDを変更した場合にのみ、パイプが実行されます。それはオブジェクトに降下しません。つまり、this.cats[2].name = "Fluffy"
たとえばネストされた属性を変更した場合、パイプは再実行されません。これにより、Angularが高速になります。角パイプはデフォルトで純粋です。
一方、不純なパイプはオブジェクトの属性をチェックします。これにより、速度が大幅に低下する可能性があります。パイプ関数が何をするかを保証できないため(たとえば、時刻に基づいて異なる順序でソートされる可能性があります)、非同期イベントが発生するたびに不純なパイプが実行されます。配列が大きい場合、これはアプリをかなり遅くします。
上のパイプは純正です。つまり、配列内のオブジェクトが不変である場合にのみ実行されます。猫を変更する場合は、猫オブジェクト全体を新しい猫オブジェクトに置き換える必要があります。
this.cats[2] = {name:"Tomy"}
pure属性を設定することで、上記を不純なパイプに変更できます。
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)
}
}
このパイプはオブジェクトに下降しますが、遅くなります。注意して使用してください。