Javascript 如何检查管道中未定义的项目?
我使用Angular2和自定义管道来过滤我的项目,如:Javascript 如何检查管道中未定义的项目?,javascript,typescript,angular,Javascript,Typescript,Angular,我使用Angular2和自定义管道来过滤我的项目,如: transform(value: any, args: string[]): any { if (args) { return value.filter(foo => foo.url.indexOf(args) != -1) }; return value; } 但是我的foo.url项目中有一些未定义,我遇到了以下错误: TypeError:无法读取未定义的属性“indexOf” 如何检查属性是
transform(value: any, args: string[]): any {
if (args) {
return value.filter(foo => foo.url.indexOf(args) != -1)
};
return value;
}
但是我的foo.url
项目中有一些未定义,我遇到了以下错误:
TypeError:无法读取未定义的属性“indexOf”
如何检查属性是否未定义且将被过滤?您正在使用TypeScript,因此是时候开始利用它带来的所有好处了。指定类型,而不是使用类型为
any
的参数编写此transform
函数。这将有助于缓解像这样愚蠢的运行时问题。显然,您假设value
参数是一个数组,因此将其声明为一个数组(我们将对返回类型执行相同的操作)。那么它是什么类型的阵列,让我们演示一下……而不是:
transform(value: any, args: string[]): any {
if (args) {
return value.filter(foo => foo.url.indexOf(args) != -1)
};
return value;
}
让我们这样写:
transform(value: Foo[], args: string[]): Foo[] {
if (args) {
return value.filter(foo => foo.url.indexOf(args) != -1)
};
return value;
}
然后我们可以有一个表示Foo
的类:
export class Foo {
constructor(url: string);
}
这将确保有助于防止在运行时属性url
未定义时出现运行时问题。您可以尝试以下方法:
transform(value: any, args: string[]): any {
if (args) {
return value.filter(foo => {
return (foo.url && (foo.url.indexOf(args) != -1));
});
}
return value;
}
你是说除了使用
if(!foo.url)
?另外,请阅读您添加到问题中的标签说明。两者都与Angular或JavaScript无关。对不起,我已经修复了…@mike mccaughan除此之外,你能告诉我我过滤函数中的语法吗?这将在你的开发中出现很多东西,我真的认为你应该先尝试一些东西。如果我用勺子喂你答案,你什么也学不到。