也許這將有助於理解此代碼的作用,以便您可以根據需要進行更改。
transform(value:index[],filterBy:any):index[]
{
filterBy=filterBy?filterBy.toLocaleLowerCase():null;
return filterBy?value.filter((book:index)=>
book.Name.toLocaleLowerCase().indexOf(filterBy)!==-1):value
// here I want to use year filter in that line.
}
第一行是處理傳入的過濾條件。如果設置了filterBy變量,它會將其轉換爲小寫。這對字符串是必需的,以確保匹配不區分大小寫。如果未設置filterBy變量,則將filterBy設置爲null。那是什麼x? y:z語法。如果x是真的,它就是y,否則它就是z。
第二行是使用JavaScript過濾功能(你可以找到我們的更多的是在這裏:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
它首先重新檢查filterBy的價值,因爲我們可以將其設置爲空第一行。它再次使用x? y:z語法。如果未設置x,則執行z,這是返回原始值的情況。這是有道理的,因爲如果沒有filterBy,你確實希望它返回整個數組。
如果filterBy 是集合,它將調用該值的JavaScript過濾器函數,該值是要過濾的數組。過濾器獲取數組中的每個元素並使用提供的箭頭函數進行比較。在這個例子中,箭頭的功能是:
book.Name.toLocaleLowerCase().indexOf(filterBy)!==-1)
這行代碼是用書的name屬性並將其轉換成小寫的區分大小寫的搜索。如果你想檢查一個不同的屬性,這裏將是你要指定它的地方。如果你是在比較一個數字,你不需要將它轉換爲小寫。
箭頭函數使用JavaScript indexOf函數在提供的屬性中查找filterBy字符串的位置。在這種情況下,它正在book.Name中查找它。你可以在這裏找到更多關於indexOf的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf
indexOf返回一個數字值,標識它找到filterBy字符串的位置,如果找不到則返回-1。
我們並不在乎它發現的字符串在哪裏,我們只是在意它是!==到-1。
所以這就是這個代碼是怎麼回事。
希望這會讓您更容易根據需要對其進行修改。
但是請注意:強烈建議您不要使用管道來執行過濾。
我對如何做過濾,而無需使用類似的語法上文這裏所描述的管道的例子:Custom pipe to sort array of array
所以不是'book.Name'你在代碼中使用例如'book.year'?什麼是問題? – DeborahK
另外還要注意,使用管道進行過濾通常不是一個好主意。看到文檔在這裏:https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe – DeborahK
是的,我用book.year但之後,我可以把? –