范围"这个"在jquery小部件

时间:2016-11-16 13:12:37

标签: javascript jquery json grep widget

我有两组JSON数据,一组包含我想要过滤的数据,第二组表示过滤器的标准。

过滤器结构非常基本。它包含它过滤的元素的Id及其值。

另一个结构包含多个字段,包括与过滤器结构相关的Id。

这两个都存储在小部件的全局部分中。通常,我会使用this.filterData或this.jsonObjects来访问它们。但是,如果我尝试使用grep或javascript array.filter函数进行过滤,那么"这个"变化,所以我不能再访问数据了。有办法解决这个问题吗?

    applyFilters: function() {
        //var returnedData = $.grep(this.options.jsonObjects, this.grepFunction);
        var returnedData = this.options.jsonObjects.filter(this.filterMatch);
        filteredData = returnedData;
        this.options.onFilterApply.call(this);
    },

    filterMatch: function(element) {
        for(var key in this.filterData) {
            if(this.filterData.hasOwnProperty(key)) {
                for(var a = 0; a < this.filterData[key].values.length; a++) {
                    if(element[this.filterData[key].id]==this.filterData[key].values[a]) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

希望这是有道理的。在applyFilters功能期间,&#34;这个&#34;表示小部件本身,它工作正常。但是一旦它进入filterMatch函数,&#34;这个&#34;成为窗口,所以this.filterData是未定义的。如何访问该函数中的filterData,或者最终,什么是过滤JSON对象列表的最佳方法?

1 个答案:

答案 0 :(得分:1)

您可以在输入filterMatch函数之前将范围保存在变量中。 类似的东西:

var that = this;

    applyFilters: function() {
        //var returnedData = $.grep(this.options.jsonObjects, this.grepFunction);
        var returnedData = this.options.jsonObjects.filter(this.filterMatch);
        filteredData = returnedData;
        this.options.onFilterApply.call(this);
    },

    filterMatch: function(element) {
        for(var key in that.filterData) {
            if(that.filterData.hasOwnProperty(key)) {
                for(var a = 0; a < that.filterData[key].values.length; a++) {
                    if(element[that.filterData[key].id]==that.filterData[key].values[a]) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

您也可以将此绑定到函数范围。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind