也许这将有助于理解此代码的作用,以便您可以根据需要进行更改。
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但之后,我可以把? –