从 URL 创建一个 JavaScript 数组

Posted

技术标签:

【中文标题】从 URL 创建一个 JavaScript 数组【英文标题】:Make a JavaScript array from URL 【发布时间】:2011-05-16 21:56:49 【问题描述】:

我需要从 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 的一部分)。是否有一些内置函数可以做到这一点?

提前致谢!

【问题讨论】:

可能重复:***.com/questions/2090551/… 这个其他问题不讨论序列化(仅反序列化)。 这不是一个真正的数组,它是一个具有属性的对象。换句话说,符号是正确的,但术语是错误的。 @Pointy:是的,但我实际上认为“(关联)数组”比“对象”更具可读性,并且可以理解。 @casablanca 我不反对,但问题明确地说,“JavaScript 数组”,但真正描述的不应该是 Array 实例。 【参考方案1】:

数组的URL:(改编自my answer here)

function URLToArray(url) 
    var request = ;
    var pairs = url.substring(url.indexOf('?') + 1).split('&');
    for (var i = 0; i < pairs.length; i++) 
        if(!pairs[i])
            continue;
        var pair = pairs[i].split('=');
        request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
     
     return request;

数组到 URL:

function ArrayToURL(array) 
  var pairs = [];
  for (var key in array)
    if (array.hasOwnProperty(key))

      pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(array[key]));
  return pairs.join('&');

【讨论】:

我不需要解析位置,而是一个包含 URL 的变量。我尝试运行它(将位置替换为变量名)并且它“挂起”在这一行 var pairs = location.search.substring(1).split('&'); @skazhy:我已经编辑了函数以接受参数。 感谢您提供此解决方案,它非常适合我的需要 [仅需要第一个功能]。我打算将 URI.js 与 jQuery 一起使用,但这是一个更简单、更有说服力的解决方案。 不错的功能,但如果您的 url 字符串中有类似 elem[]=23&elem[]=55; 谢谢!这很好用。但是,如果您给它一个不带参数的 URL,它会返回对象中的 URL:http://example.com: "undefined"。我稍作修改以返回未定义:var qIndex = url.indexOf('?'); if(qIndex == -1) return undefined; var pairs = url.substring(qIndex + 1).split('&amp;');【参考方案2】:

当 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;
    

endWith 取自here

function endsWith(str, suffix) 
    return str.indexOf(suffix, str.length - suffix.length) !== -1;

【讨论】:

【参考方案3】:
 /**
 * (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;

    

【讨论】:

考虑为您发布的代码添加任何描述、解释、评论。【参考方案4】:

query-object jQuery plugin 就是为了这个

【讨论】:

以上是关于从 URL 创建一个 JavaScript 数组的主要内容,如果未能解决你的问题,请参考以下文章

将 Javascript 数组发送到控制器并在另一个 URL 中呈现视图结果

将数据从 javascript forEach 循环中的 php 数组发送到 ajax 调用的 url

快速排序的JavaScript实现

使用jquery表中的复选框从数组中删除JavaScript对象

javascript中slice(),splice(),split(),substring(),substr()使用方法

如何在javascript中从现有数组创建一个新数组