@@ -14,6 +14,7 @@ module.exports = function parse_str (str, array) { // eslint-disable-line camelc
14
14
// input by: Zaide (http://zaidesthings.com/)
15
15
// input by: David Pesta (http://davidpesta.com/)
16
16
// input by: jeicquest
17
+ // bugfixed by: Rafał Kukawski
17
18
// note 1: When no argument is specified, will put variables in global scope.
18
19
// note 1: When a particular argument has been passed, and the
19
20
// note 1: returned value is different parse_str of PHP.
@@ -30,6 +31,14 @@ module.exports = function parse_str (str, array) { // eslint-disable-line camelc
30
31
// example 3: parse_str('a[b]["c"]=def&a[q]=t+5', $abc)
31
32
// example 3: var $result = $abc
32
33
// returns 3: {"3":"a","a":{"b":{"c":"def"},"q":"t 5"}}
34
+ // example 4: var $arr = {}
35
+ // example 4: parse_str('a[][]=value', $arr)
36
+ // example 4: var $result = $arr
37
+ // returns 4: {"a":{"0":{"0":"value"}}}
38
+ // example 5: var $arr = {}
39
+ // example 5: parse_str('a=1&a[]=2', $arr)
40
+ // example 5: var $result = $arr
41
+ // returns 5: {"a":{"0":"2"}}
33
42
34
43
var strArr = String ( str ) . replace ( / ^ & / , '' ) . replace ( / & $ / , '' ) . split ( '&' )
35
44
var sal = strArr . length
@@ -39,7 +48,6 @@ module.exports = function parse_str (str, array) { // eslint-disable-line camelc
39
48
var p
40
49
var lastObj
41
50
var obj
42
- var undef
43
51
var chr
44
52
var tmp
45
53
var key
@@ -69,12 +77,15 @@ module.exports = function parse_str (str, array) { // eslint-disable-line camelc
69
77
while ( key . charAt ( 0 ) === ' ' ) {
70
78
key = key . slice ( 1 )
71
79
}
80
+
72
81
if ( key . indexOf ( '\x00' ) > - 1 ) {
73
82
key = key . slice ( 0 , key . indexOf ( '\x00' ) )
74
83
}
84
+
75
85
if ( key && key . charAt ( 0 ) !== '[' ) {
76
86
keys = [ ]
77
87
postLeftBracketPos = 0
88
+
78
89
for ( j = 0 ; j < key . length ; j ++ ) {
79
90
if ( key . charAt ( j ) === '[' && ! postLeftBracketPos ) {
80
91
postLeftBracketPos = j + 1
@@ -83,49 +94,62 @@ module.exports = function parse_str (str, array) { // eslint-disable-line camelc
83
94
if ( ! keys . length ) {
84
95
keys . push ( key . slice ( 0 , postLeftBracketPos - 1 ) )
85
96
}
97
+
86
98
keys . push ( key . substr ( postLeftBracketPos , j - postLeftBracketPos ) )
87
99
postLeftBracketPos = 0
100
+
88
101
if ( key . charAt ( j + 1 ) !== '[' ) {
89
102
break
90
103
}
91
104
}
92
105
}
93
106
}
107
+
94
108
if ( ! keys . length ) {
95
109
keys = [ key ]
96
110
}
111
+
97
112
for ( j = 0 ; j < keys [ 0 ] . length ; j ++ ) {
98
113
chr = keys [ 0 ] . charAt ( j )
114
+
99
115
if ( chr === ' ' || chr === '.' || chr === '[' ) {
100
116
keys [ 0 ] = keys [ 0 ] . substr ( 0 , j ) + '_' + keys [ 0 ] . substr ( j + 1 )
101
117
}
118
+
102
119
if ( chr === '[' ) {
103
120
break
104
121
}
105
122
}
106
123
107
124
obj = array
125
+
108
126
for ( j = 0 , keysLen = keys . length ; j < keysLen ; j ++ ) {
109
127
key = keys [ j ] . replace ( / ^ [ ' " ] / , '' ) . replace ( / [ ' " ] $ / , '' )
110
128
lastObj = obj
111
- if ( ( key !== '' && key !== ' ' ) || j === 0 ) {
112
- if ( obj [ key ] === undef ) {
113
- obj [ key ] = { }
114
- }
115
- obj = obj [ key ]
116
- } else {
117
- // To insert new dimension
129
+
130
+ if ( ( key === '' || key === ' ' ) && j !== 0 ) {
131
+ // Insert new dimension
118
132
ct = - 1
133
+
119
134
for ( p in obj ) {
120
135
if ( obj . hasOwnProperty ( p ) ) {
121
136
if ( + p > ct && p . match ( / ^ \d + $ / g) ) {
122
137
ct = + p
123
138
}
124
139
}
125
140
}
141
+
126
142
key = ct + 1
127
143
}
144
+
145
+ // if primitive value, replace with object
146
+ if ( Object ( obj [ key ] ) !== obj [ key ] ) {
147
+ obj [ key ] = { }
148
+ }
149
+
150
+ obj = obj [ key ]
128
151
}
152
+
129
153
lastObj [ key ] = value
130
154
}
131
155
}
0 commit comments