我有两组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对象列表的最佳方法?
答案 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