在变量索引处插入字符串

Inserting a string at a variable index

本文关键字:插入 字符串 索引 变量      更新时间:2023-09-26

我一直找不到一个工作示例,也找不到关于如何实现以下目标的好解释:(如果有人能给我指明正确的方向,我将不胜感激。

我有一个查询字符串:**"/api/bla?sources=[1,2]&plans=[1,2]&codes=[1,2,3]"**

当我的页面上发生某些事件时,我将通过javascriptjquery更新查询字符串,无论是哪一个。

例如,页面上有一个多选下拉列表,其中包含[sources]和[plans和[codes

当从下拉列表中选择ID为"3"的源(或复选框,无论使用的是什么页面控件)时,查询字符串参数sources[1,2]将需要附加一个"3"。同样,如果ID为"2"的项目未被选中,它也将从查询字符串中删除,留下sources[1,3]的新字符串

我对javascript/jquery有些陌生,尤其是更高级的字符串操作。我一直在尝试重新创造一些东西来证明这一点,但以下内容并没有完全奏效。

基本上,我最初的if语句按预期工作,但当其他语句被命中时(当需要向查询字符串中的现有模型添加另一个ID时,比如[sources]或[codes]的第二个ID),它会返回不稳定的输出,似乎我无法获得正确的公式来正确更新所有内容。

//TIMEMTABLE QUERY
function updateCalendar(filter_id, filter_element) {
    //Run through the filter checks before making final call to query and update timetable?
    //GET THE MODEL/OBJECT NAME
    var queryName = filter_element.attr('data-owner');

    //GET THE IDs //this is either an array of all selected IDs or a single id which is used in the else statement
    var queryId = filter_element.attr('value');
    var queryIds = $('#'+filter_id).val();

    var modelCheckIndex = requestString.toLowerCase().indexOf(queryName.toLowerCase());
    //build a request string
    if (modelCheckIndex < 0) {
        console.info('ADD MODEL TO QUERY STRING');
        requestString = requestString + "&" + (queryName.toLowerCase() + "[" + queryIds + "]");
        console.log(requestString);
    }
    else{
        console.info('UPDATE MODEL ON QUERY STRING');
        var position = requestString.toLowerCase().indexOf(queryName.toLowerCase());
        //requestString = requestString.substr(modelCheckIndex -1, requestString.length -1) + "," + queryId + "]";
        requestString = requestString.slice(modelCheckIndex.indexOf("]"), modelCheckIndex) + "," + queryId;
        console.log(requestString);
    }
//MAKE THE API CALL USING CREATED QUERY STRING
}

如果有人有任何例子或技巧,我也会很感激。Fiddle我正试图开始工作

您似乎只是在解析和更新查询字符串时遇到了问题。在这种情况下,我有一个我一直在使用的功能(感谢谷歌)

function getUriParams(string) {
    var params = {},
    queryString = string.slice(string.lastIndexOf('?')).substring(1),
    regex = /([^&=]+)=([^&]*)/g,
    m;
    while (m = regex.exec(queryString)) {
        params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
    }
    return params;
}

输入是requestString,输出是查询字符串的键值对的对象。

为了使对象成为字符串,jQuery使$.param()变得简单。

//get key value pairs
var obj = getUriParams(requestString);
//make query string
var str = $.param(obj);

我建议稍微更改一下逻辑。我会为所需的参数使用一些数据存储,并在每次必要时重新生成请求字符串,就像下面的例子一样。

这比每次值发生变化时重新生成字符串要好得多。

var data = {
        sources: [1, 2],
        plans: [],
        codes: [1, 3, 4]
    };
function buildStr() {
    function get(key) { return key + '=' + JSON.stringify(data[key]); }
    return '/api/bla?' + ['sources', 'plans', 'codes'].map(get).join('&');
}
document.write('<pre>' + buildStr() + '</pre>');