在pipe的变换方法中使return语句通用

时间:2017-05-01 06:24:28

标签: javascript angular generics typescript

我创建了一个管道,如下所示:

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;
    }

}

但是当我尝试调用该函数时,我收到错误。

1 个答案:

答案 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代码。