我正在构建一个主要使用Tableau元素(过滤器,可视化等)的Web应用程序,而我遇到的问题是在网页上传递大量(动态)过滤参数。我一直试图使用下面的JavaScript,但没有运气。
function getFilterd()
{
var worksheets = vizFilter.getWorkbook().getActiveSheet().getWorksheets();
var prjArray = window.location.search.substring(1).split(',');
var newArray = [];
//Run through field/filter names
var displayFilters = function (filters) {
for (var i = 0; i < filters.length; i++) {
filterName = filters[i].getFieldName();
//If field/filter name == PRJECT then store selected values in an array
if (filterName == 'PRJECT') {
filterList = []
for (var z = 0; z < filters[i].getAppliedValues().length; z++) {
filterList[z] = filters[i].getAppliedValues()[z].value;
}
//Compare filterList values to prjArray and push to newArray if a match
for (var t = 0; t < filterList.length; t++) {
if (filterList[t].getAppliedValues()[t].value.substring(4) == prjArray) {
newArray.push(filterList[t]);
}
}
}
}
}
}
//Runs through each worksheet in active workbook (optional)
for (var worksheetIndex = 0; worksheetIndex < worksheets.length; worksheetIndex++){
worksheets[worksheetIndex].getFiltersAsync().then(displayFilters);
}
}
答案 0 :(得分:0)
在split()
上执行window.location.search.substring(1)
时,会返回一个数组。在这里,您将子字符串与数组进行比较,并且总是返回false。
if (filterList[t].getAppliedValues()[t].value.substring(4) == prjArray) {
newArray.push(filterList[t]);
}
此外,您只是将值放入filterList
并尝试使用getAppliedValues
访问它们不起作用。
您需要测试子字符串是否在数组中。您可以使用includes()
来确定数组是否包含提供的值。
if (prjArray.includes(filterList[t].substring(4))) {
newArray.push(filterList[t]);
}
includes()
方法为not completely supported by all browsers。如果您需要向后兼容性,可以使用indexOf
执行此操作,并且测试是否返回-1
以外的其他
if (prjArray.indexOf(filterList[t].substring(4)) !== -1) {
newArray.push(filterList[t]);
}
答案 1 :(得分:0)
所以我终于弄清楚了。正如贾斯汀在回答中提到的那样,下面的逻辑是不正确的:
//Compare filterList values to prjArray and push to newArray if a match
for (var t = 0; t < filterList.length; t++) {
if (filterList[t].getAppliedValues()[t].value.substring(4) == prjArray) {
newArray.push(filterList[t]);
}
}
此外,if语句中存在一些语法错误。以下是确实返回所需数组的修订语句:
//Compare filterList values to prjArray and push to newArray if a match
newArray = []
for (var t = 0; t < filterList.length; t++){
if (prjArray.indexOf(filterList[t].substring(4)) != -1) {
newArray.push(filterList[t]);
};
}