从URL创建JavaScript数组
我需要从URL创建一个Javascript数组,例如: 把这个翻过来:从URL创建JavaScript数组,javascript,url,Javascript,Url,我需要从URL创建一个Javascript数组,例如: 把这个翻过来: http://maps.google.com/maps/api/staticmap?center=Baker Street 221b, London&size=450x450&markers=Baker Street 221b, London&sensor=false 变成类似于: array['center'] = Baker Street 221b, London array['size'] =
http://maps.google.com/maps/api/staticmap?center=Baker Street 221b, London&size=450x450&markers=Baker Street 221b, London&sensor=false
变成类似于:
array['center'] = Baker Street 221b, London
array['size'] = 450x450
// and so on...
我需要使这个序列化/非序列化双向工作(url到数组和数组到url的一部分)。是否有一些内置函数可以执行此操作
提前谢谢 URL到数组:(改编自)
当url字符串具有elem[]=23&elem[]=56时,上述函数URLToArray不起作用。。 请参见下面的调整功能。。。希望它能工作-不是100%测试
function URLToArray(url) {
var request = {};
var arr = [];
var pairs = url.substring(url.indexOf('?') + 1).split('&');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
//check we have an array here - add array numeric indexes so the key elem[] is not identical.
if(endsWith(decodeURIComponent(pair[0]), '[]') ) {
var arrName = decodeURIComponent(pair[0]).substring(0, decodeURIComponent(pair[0]).length - 2);
if(!(arrName in arr)) {
arr.push(arrName);
arr[arrName] = [];
}
arr[arrName].push(decodeURIComponent(pair[1]));
request[arrName] = arr[arrName];
} else {
request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
}
}
return request;
}
/**
*(C)VIOLONIX公司。
*用于从生成多维数组的解析器
*foo[]=any&foo[]=男孩,或foo[0][kids]=any&foo[1][kids]=男孩
*结果:foo=[[any],[boy]]或foo=[kids:[any],kids:[boy]]
*/
var URLToArray=函数(url){
函数parse_mdim(名称、值、数据){
设params=name.match(/(\[\])|(\[.+?\])/g);
如果(!params)params=new Array();
让tg_id=name.split('[')[0];
如果(!(数据中的tg_id))数据[tg_id]=[];
var prev_data=数据[tg_id];
for(var i=0;i可能重复:这个问题没有讨论序列化(仅反序列化)。这不是一个真正的数组,而是一个具有属性的对象。换句话说,符号是正确的,但术语是不正确的。@Pointy:True,但我认为“(关联)数组”比“对象”更可读我不反对,但问题明确地说,“JavaScript数组”,但所描述的实际上不应该是数组实例。我不需要解析位置,只需要一个包含URL的变量。我尝试运行它(用变量名替换位置),结果它“挂起”在这一行中,var pairs=location.search.substring(1).split('&');@skazhy:我编辑了函数以接受一个参数。感谢您提供此解决方案,它非常适合我所需的[只需要第一个函数]。我本来打算在jQuery中使用URI.js,但这是一个更简单、更有说服力的解决方案。如果url字符串中有smth,如elem[]=23&elem[]=55,则函数不错,但urltoarray不起作用;谢谢!这非常有效。但是,如果给它一个不带参数的url,它会在对象中返回url:{http://example.com: “未定义”}
。我稍微修改了它以返回未定义的:var qIndex=url.indexOf('?');if(qIndex==-1){return undefined;}var pairs=url.substring(qIndex+1)。split('&');
考虑向发布的代码添加任何描述、解释和注释。
function ArrayToURL(array) {
var pairs = [];
for (var key in array)
if (array.hasOwnProperty(key))
pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(array[key]));
return pairs.join('&');
}
function URLToArray(url) {
var request = {};
var arr = [];
var pairs = url.substring(url.indexOf('?') + 1).split('&');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
//check we have an array here - add array numeric indexes so the key elem[] is not identical.
if(endsWith(decodeURIComponent(pair[0]), '[]') ) {
var arrName = decodeURIComponent(pair[0]).substring(0, decodeURIComponent(pair[0]).length - 2);
if(!(arrName in arr)) {
arr.push(arrName);
arr[arrName] = [];
}
arr[arrName].push(decodeURIComponent(pair[1]));
request[arrName] = arr[arrName];
} else {
request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
}
}
return request;
}
function endsWith(str, suffix) {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
/**
* (C)VIOLONIX inc.
* Parser for make multidim array from
* foo[]=any&foo[]=boy, or foo[0][kids]=any&foo[1][kids]=boy
* result: foo=[[any],[boy]] or foo=[kids:[any],kids:[boy]]
*/
var URLToArray = function(url){
function parse_mdim(name, val, data){
let params = name.match(/(\[\])|(\[.+?\])/g);
if(!params)params = new Array();
let tg_id = name.split('[')[0];
if(!(tg_id in data)) data[tg_id] = [];
var prev_data = data[tg_id];
for(var i=0;i<params.length;i++){
if(params[i]!='[]'){
let tparam = params[i].match(/\[(.+)\]/i)[1];
if(!(tparam in prev_data)) prev_data[tparam] = [];
prev_data = prev_data[tparam];
}else{
prev_data.push([]);
prev_data = prev_data[prev_data.length-1];
}
}
prev_data.push(val);
}
var request = {};
var arr = [];
var pairs = url.substring(url.indexOf('?') + 1).split('&');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
if(decodeURIComponent(pair[0]).indexOf('[')!=-1)
parse_mdim(decodeURIComponent(pair[0]), decodeURIComponent(pair[1]), request);
else
request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
}
//To-do here check array and simplifity it: if parameter end with one index in array replace it by value [0]
return request;
}