从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'] =

我需要从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'] = 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;

    }