Cos的反函数:JavaScript/jQuery中的$.param()反函数

给定以下形式:

<form>
    <input name="foo" value="bar">
    <input name="o" value="o world">
</form>

我可以使用$.param( .. )构造来序列化表单:

$.param( $('form input') )
=> foo=bar&o=o+world

如何使用 JavaScript 反序列化上述字符串并获取哈希?

例如

$.magicFunction("foo=bar&o=o+world")
=> {'foo' : 'bar', 'o' : 'o world'}

参考:jQuery.param( obj )

62

您应该使用jQuery BBQdeparam函数。

31

这是我前段时间写的一个函数的稍微修改的版本,做类似的事情。

var QueryStringToHash = function QueryStringToHash  (query) {
  var query_string = {};
  var vars = query.split("&");
  for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split("=");
    pair[0] = decodeURIComponent(pair[0]);
    pair[1] = decodeURIComponent(pair[1]);
        // If first entry with this name
    if (typeof query_string[pair[0]] === "undefined") {
      query_string[pair[0]] = pair[1];
        // If second entry with this name
    } else if (typeof query_string[pair[0]] === "string") {
      var arr = [ query_string[pair[0]], pair[1] ];
      query_string[pair[0]] = arr;
        // If third or later entry with this name
    } else {
      query_string[pair[0]].push(pair[1]);
    }
  } 
  return query_string;
};
20

这个简短的功能方法怎么样?

function pParams(str) {
    return str.split('&').reduce(function (params, param) {
        var paramSplit = param.split('=').map(function (value) {
            return decodeURIComponent(value.replace(/\+/g, ' '));
        });
        params[paramSplit[0]] = paramSplit[1];
        return params;
    }, {});
}

例子:

pParams("this=is&just=an&example") // Object {this: "is", just: "an", example: undefined}
18

我的回答:

function(query){
  var setValue = function(root, path, value){
    if(path.length > 1){
      var dir = path.shift();
      if( typeof root[dir] == 'undefined' ){
        root[dir] = path[0] == '' ? [] : {};
      }
      arguments.callee(root[dir], path, value);
    }else{
      if( root instanceof Array ){
        root.push(value);
      }else{
        root[path] = value;
      }
    }
  };
  var nvp = query.split('&');
  var data = {};
  for( var i = 0 ; i < nvp.length ; i++ ){
    var pair = nvp[i].split('=');
    var name = decodeURIComponent(pair[0]);
    var value = decodeURIComponent(pair[1]);
    var path = name.match(/(^[^\[]+)(\[.*\]$)?/);
    var first = path[1];
    if(path[2]){
      //case of 'array[level1]' || 'array[level1][level2]'
      path = path[2].match(/(?=\[(.*)\]$)/)[1].split('][')
    }else{
      //case of 'name'
      path = [];
    }
    path.unshift(first);
    setValue(data, path, value);
  }
  return data;
}

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(832)
闪迪cz80事件:将 80/443以外的端口用于事件通知URL(webhook)
上一篇
智能编程灯:用编程语言控制调光灯(can you group philips hue lights)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(45条)