indexOf不是一个函数 - Angular 2 / Typescript

时间:2017-01-05 17:04:31

标签: javascript angular typescript

抓住我的头......

我有一个名为 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绝对是一个字符串数组,应该有这个函数,不是吗?

1 个答案:

答案 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是无操作。