-
-
Save rcmachado/242617 to your computer and use it in GitHub Desktop.
/** | |
* $.unserialize | |
* | |
* Takes a string in format "param1=value1¶m2=value2" and returns an object { param1: 'value1', param2: 'value2' }. If the "param1" ends with "[]" the param is treated as an array. | |
* | |
* Example: | |
* | |
* Input: param1=value1¶m2=value2 | |
* Return: { param1 : value1, param2: value2 } | |
* | |
* Input: param1[]=value1¶m1[]=value2 | |
* Return: { param1: [ value1, value2 ] } | |
* | |
* @todo Support params like "param1[name]=value1" (should return { param1: { name: value1 } }) | |
*/ | |
(function($){ | |
$.unserialize = function(serializedString){ | |
var str = decodeURI(serializedString); | |
var pairs = str.split('&'); | |
var obj = {}, p, idx, val; | |
for (var i=0, n=pairs.length; i < n; i++) { | |
p = pairs[i].split('='); | |
idx = p[0]; | |
if (idx.indexOf("[]") == (idx.length - 2)) { | |
// Eh um vetor | |
var ind = idx.substring(0, idx.length-2) | |
if (obj[ind] === undefined) { | |
obj[ind] = []; | |
} | |
obj[ind].push(p[1]); | |
} | |
else { | |
obj[idx] = p[1]; | |
} | |
} | |
return obj; | |
}; | |
})(jQuery); |
I don't understand how one implies the other.
$.get('page.php', $.unserialize('foo=bar%3Dbaz'));
This will create a request with a URL like page.php?foo=bar%253Dbaz
. Special characters will be encoded twice.
Nice.
Think should be faster:
if (idx.constructor==[].constructor)
instead of
if (idx.indexOf("[]") == (idx.length - 2)) {
There are 2 bugs in this one, which I forked to fix: https://gist.github.com/brucekirkpatrick/7026682
Bug 1: the values were not unescaped. Bug 2: If you had 2 field names with the same name that didn't use the bracket naming convention, the extra values would be lost, they should become an array or at least a comma separated string. I choose array. Here is code to demonstrate the problems:
console.log($.unserialize("one="+escape("& = ?")+"&two="+escape("value1")+"&two="+escape("value2")+"&three[]="+escape("value1")+"&three[]="+escape("value2")+"&three[]="+escape("value3")));
Won't this break if the value contains an encoded & or =?