javascript - 在 jquery 小部件中使用 grep 时, "this"的范围发生变化

标签 javascript jquery json grep widget

我有两组 JSON 数据,一组包含我要过滤的数据,第二组代表过滤器的条件。

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

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

这两者都存储在小部件的全局部分中。通常,我会使用 this.filterData 或 this.jsonObjects 来访问它们。但是,如果我尝试使用 grep 或 javascript array.filter 函数进行过滤,则“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 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 函数中,“this”代表小部件本身,并且它工作正常。但是一旦进入filterMatch函数,“this”就变成了窗口,所以this.filterData是未定义的。我如何访问该函数内的 filterData,或者最终过滤 JSON 对象列表的最佳方法是什么?

最佳答案

在进入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;
    }

您也可以将 this 绑定(bind)到函数作用域。

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

关于javascript - 在 jquery 小部件中使用 grep 时, "this"的范围发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40633053/

相关文章:

javascript - 将文本和选项移动到输入 html 和 jquery 中

jquery - 垂直居中响应图像

javascript - 从远程服务器获取一个 JSON 文件(包含希伯来语值)并在 Node.js 中解析它

json - 看起来当我执行 fs.writeFile() 时,更改的文件会重新启动 nodemon。怎么让它不重启?

javascript - onchange 函数在初始文本框中工作,但在另一个文本框中不起作用

javascript - 在 MongoDB 控制台中创建函数

javascript - 服务执行后延迟 Controller 初始化

javascript - JQuery 发布到 REST 服务

java - java解析JSON字符串,最佳实践

javascript - 存储过程 azure Cosmos DB 返回空集合