我正在编写一个管道来过滤对象数组中的值。我已经实现了基础,但是我在处理空字符串,空值和未定义的值时遇到了问题。只要将其中一个值传递给管道,就应返回数组中的所有值。管道能够过滤对象的属性,以及过滤原始字符串或数值的数组。我有一些我写过的测试用例。除了处理这篇文章标题的人之外,所有人都在过世。
属性-filter.pipe.ts
export class PropertyFilterPipe implements PipeTransform {
transform(value: any[], args: any[] | any): any[] {
const filterProperty = args[1]; // property to filter on
const minVal = args[0] || args; // input from user to filter
return value.filter((item: any) => {
if (item[filterProperty] && minVal !== ('' || undefined || null))
return item[filterProperty].toString().includes(minVal);
else if (minVal === ('' || undefined || null)) // where I'm trying to handle the "empty" cases
return (item[filterProperty].toString().includes(item) || item.toString().includes(item));
else return item.toString().includes(minVal);
});
}
}
测试用例失败
it('should return a list of all matches if the user has not given any input', function () {
const icas = [
{ica: '123'},
{ica: '456'},
{ica: '789'},
{ica: '1234'}
];
const filterProp = 'ica';
const nums = [123, 456, 789];
let result = pipe.transform(icas, ['', filterProp]);
expect(result).toEqual(icas);
result = pipe.transform(icas, [null, filterProp]);
expect(result).toEqual(icas);
result = pipe.transform(icas, [undefined, filterProp]);
expect(result).toEqual(icas);
result = pipe.transform(nums, '');
expect(result).toEqual([123, 456, 789]);
result = pipe.transform(nums, null);
expect(result).toEqual([123, 456, 789]);
result = pipe.transform(nums, undefined);
expect(result).toEqual([123, 456, 789]);
});
测试用例中expect
语句的结果是一个空数组,它应该返回所有值的数组(即icas
或nums
)。
答案 0 :(得分:0)
您的测试似乎不对,但您的实现是。
else if
语句右侧的条件始终为false。所以你实际上正在检查minVal === false
,这绝不是这种情况。
将此更改为else if (!minVal) { ... }
就足够了。
编辑:同样适用于第一个条件,它应该是if (item[filterProperty] && minVal)
。