通过匹配使用JavaScript在url中传递的值来创建新数组

时间:2018-05-31 18:25:14

标签: javascript

我正在构建一个主要使用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); 
    }   
}

2 个答案:

答案 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]);
    };
}