抓住我的头......
我有一个名为 filterProducts 的函数,只要用户单击一个复选框,就会在我的Angular 2组件中调用它。现在,该方法查找使用特定类名检查的所有复选框,获取其值,然后尝试对数组进行排序。相当简单......
// Called when any checkbox is checked or unchecked
filterProducts() {
// Grab all "Program" checkboxes that are checked
var programsToInclude = $(".programCheckbox:checkbox:checked").map(function () { return this.value; });
// If any "Program" checkboxes are checked, filter the list accordingly
if (programsToInclude)
this.filteredProducts = this.filteredProducts.filter(x => programsToInclude.indexOf(x.programName) > -1);
}
为什么我收到以下错误?
ORIGINAL EXCEPTION: TypeError: programsToInclude.indexOf is not a function
programsToInclude绝对是一个字符串数组,应该有这个函数,不是吗?
答案 0 :(得分:3)
programsToInclude
不是数组,它是一个jQuery对象。 jQuery对象有很多数组方法,但不是全部。
要在使用jQuery#map
后获取数组,您需要在最后添加.get()
:
var programsToInclude = $(".programCheckbox:checkbox:checked").map(function () { return this.value; }).get();
// ---------------------------------------------------------------------------------------------------^^^^
if (programsToInclude) { // <== This check is pointless, see below the fold for why
this.filteredProducts = this.filteredProducts.filter(x => a.indexOf(x.programName) > -1);
}
或者,请尽早使用get
获取原生数组,这需要调整filter
来电:
var programsToInclude = $(".programCheckbox:checkbox:checked").get().map(function(e) { return e.value; });
// -----------------------------------------------------------------^^^^----------^-----------^
if (programsToInclude) { // <== Again, see below the fold
this.filteredProducts = this.filteredProducts.filter(x => programsToInclude.indexOf(x.programName) > -1);
}
但在这两种情况下,programsToInclude
最终都是一个数组。如果您想稍后再次将其用作jQuery对象,则必须将其转换回来。如果您以后想要使用它,可能会将数组分开:
var programsToInclude = $(".programCheckbox:checkbox:checked").map(function(e) { return e.value; });
if (programsToInclude) { // <== Same note
let a = this.programsToInclude.get();
this.filteredProducts = this.filteredProducts.filter(x => a.indexOf(x.programName) > -1);
}
为什么检查毫无意义:jQuery对象,即使是空对象,也总是很简单。如果要检查空的,请使用if (obj.length)
。但是,如果您要做filter
这样的检查没有太大意义,那么当对象为空时,filter
是无操作。