这个题目不约而同的出现在了多家公司的面试题中,当然也是因为太过于典型,解决方案无非就是拆字符或者用正则匹配来解决,我个人强烈建议用正则匹配,因为url允许用户随意输入,如果用拆字符的方式,有任何一处没有考虑到容错,就会导致整个js都报错。而正则就没有这个问题,他只匹配出正确的配对,非法的全部过滤掉,简单,方便。
实现代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
function
getQueryObject(url) {
url = url ==
null
? window.location.href : url;
var
search = url.substring(url.lastIndexOf(
"?"
) + 1);
var
obj = {};
var
reg = /([^?&=]+)=([^?&=]*)/g;
search.replace(reg,
function
(rs, $1, $2) {
var
name = decodeURIComponent($1);
var
val = decodeURIComponent($2);
val = String(val);
obj[name] = val;
return
rs;
});
return
obj;
}
getQueryObject(
"http://www.cnblogs.com/leee/p/4456840.html?name=1&dd=ddd**"
)
Object {name:
"1"
, dd:
"ddd**"
}
|
-----------------------------2016/11/10跟新------------------------------------
2,将对象转化成url参数。fetch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
function
param(a) {
var
s = [], rbracket = /\[\]$/,
isArray =
function
(obj) {
return
Object.prototype.toString.call(obj) ===
'[object Array]'
;
}, add =
function
(k, v) {
v =
typeof
v ===
'function'
? v() : v ===
null
?
''
: v === undefined ?
''
: v;
s[s.length] = encodeURIComponent(k) +
'='
+ encodeURIComponent(v);
}, buildParams =
function
(prefix, obj) {
var
i, len, key;
if
(prefix) {
if
(isArray(obj)) {
for
(i = 0, len = obj.length; i < len; i++) {
if
(rbracket.test(prefix)) {
add(prefix, obj[i]);
}
else
{
buildParams(prefix +
'['
+ (
typeof
obj[i] ===
'object'
? i :
''
) +
']'
, obj[i]);
}
}
}
else
if
(obj && String(obj) ===
'[object Object]'
) {
for
(key
in
obj) {
buildParams(prefix +
'['
+ key +
']'
, obj[key]);
}
}
else
{
add(prefix, obj);
}
}
else
if
(isArray(obj)) {
for
(i = 0, len = obj.length; i < len; i++) {
add(obj[i].name, obj[i].value);
}
}
else
{
for
(key
in
obj) {
buildParams(key, obj[key]);
}
}
return
s;
};
return
buildParams(
''
, a).join(
'&'
).replace(/%20/g,
'+'
);
}
|
用到此方法