我创建了一个管道,如下所示:
import {Pipe, PipeTransform} from '@angular/core';
@Pipe({
name: 'textFilter',
pure: false
})
export class TextFilterPipe implements PipeTransform {
transform(collection: any[], filter: string, properties: string[]): any {
if (!collection || !filter) {
return collection;
}
return collection.filter(obj => obj[properties[0]].toLocaleLowerCase().indexOf(filter.toLocaleLowerCase()) !== -1
|| obj[properties[1]].toLocaleLowerCase().indexOf(filter.toLocaleLowerCase()) !== -1);
}
}
我想在transform方法中使return语句更通用。
看看代码,我有或有条件。我应该能够检查任何数量的属性,而不是检查obj [proeprties [0]]。我想我可以使用for循环,但是我怎么也不知道。你能带我去正确的方向吗?
更新@JustAStudent:
我试图按照回答中的建议实施:
export class TextFilterPipe implements PipeTransform {
transform(collection: any[], filter: string, properties: string[]): any {
if (!collection || !filter) {
return collection;
}
return collection.filter(obj => { returnVal(obj, filter, properties) });
}
returnVal(obj: any, filter: string, properties: string[]) {
let x: boolean;
for(let i = 0; i <= properties.length - 1; i++) {
x = x || (obj[properties[i]].toLocaleLowerCase().indexOf(filter.toLocaleLowerCase()) != -1)
}
return x;
}
}
但是当我尝试调用该函数时,我收到错误。
答案 0 :(得分:1)
您可以将测试放在匿名函数中,然后使用properties
上的Array.prototype.some
函数将所需的对象属性转换为数组后使用map。
示例为runnable片段:
function pipe(collection, filter, properties) {
filter = filter.toLocaleLowerCase();
return collection.filter((obj) => {
let values = properties.map((prop) => obj[prop]);
return values.some((value) =>
value.toLocaleLowerCase().indexOf(filter) !== -1);
});
}
console.log(
pipe([{foo: 'Foo', bar: 'Bar'},
{foo: 'Test', bar: 'Bor'}], 'bo', ['bar'])
);
也可以更直接地执行此操作,而不使用remarked之间yurzui之间的映射步骤。这是通过将some
函数直接应用于属性,并在该函数中进行查找。这可能类似于以下内容(再次作为可运行的代码段)。
function pipe(collection, filter, properties) {
filter = filter.toLocaleLowerCase();
return collection.filter((obj) =>
properties.some((prop) => obj[prop].
toLocaleLowerCase().
indexOf(filter) !== -1))
}
console.log(
pipe([{foo: 'Foo', bar: 'Bar'},
{foo: 'Test', bar: 'Bor'}], 'bo', ['bar'])
);
以上两个示例都应该很容易替换为Angular代码。