【问题标题】:javascript modify url parameter arrayjavascript修改url参数数组
【发布时间】:2016-03-16 14:47:22
【问题描述】:
我有一个 url,其中有一个数组作为参数。例如:
test.dev/orders?filter[]=temp&filter[]=placed
我想创建一个js函数,可以切换数组内容,修改后重定向。
例如,如果我调用函数 toggleFilter('temp'),我希望 js 重定向到 test.dev/orders?filter[]=placed。
但是如果我打电话给toggleFilter('processed'),我想让js重定向到test.dev/orders?filter[]=temp&filter[]=placed&filter[]=processed。
我怎样才能实现这样的功能?提前致谢!
【问题讨论】:
标签:
javascript
arrays
url
parameters
toggle
【解决方案1】:
该函数需要获取当前查询字符串,将其分解,然后根据参数,重新组装。
document.location.search - 很容易地为您提供查询字符串。
String.split - 让您将其分解为各个部分。
arguments - 让我们使用它而不是定义的参数,这样您就可以传递尽可能多(或尽可能少)的过滤器。
从那里,它只是解释参数来组装一个新的查询字符串......
function toggleFilter() {
var queryString = document.location.search;
queryString = queryString.substring(1); // Get rid of the initial '?'
// Break it into individual parts and remove the 'filter[]=' leaving just the values
var queryStringSplit = queryString.split('&');
var values = [];
for (var qss = 0; qss < queryStringSplit.length; qss++) {
var value = queryStringSplit[qss];
value = value.split('=')[1];
// This will remove any "blank" values (like 'filter[]=&...")
if (value)
values.push(value);
}
// Add / remove values in arguments
for (var a = 0; a < arguments.length; a++) {
var arg = arguments[a];
var index = values.indexOf(arg);
if (index == -1)
values.push(arg);
else
values.splice(index, 1);
}
// Re-assemble the new query string
queryString = ''; // Default to blank
if (values.length)
queryString = 'filter[]=' + values.join('&filter[]=');
// Redirect to new location
location.search = queryString;
}
话虽如此,我认为如果您想让它成为可重用的任何类型,我会将其称为 toggleQueryString 并修改逻辑以将第一个参数解释为要切换的 queryString 值的名称(这样您就可以做除“filter []”之外的事情,我不会让它设置位置,而是返回一个查询字符串值,你可以做任何你想做的事情。但是这个函数应该可以解决问题。
【解决方案2】:
function toggleFilter(url, key) {
var result;
if(url.indexOf('filter[]=' + key) > -1)
result = url.replace('filter[]=' + key + '&', '').replace('filter[]=' + key, '');
else
result = url + (url.indexOf('?') > -1 ? '&' : '?') + 'filter[]=' + key;
result = result.indexOf('?') == result.length - 1 ?
result.substring(0, result.length - 1) :
result;
return result;
// or if you want to redirect just write window.location.href = result;
}