如何使用JavaScript将带参数的URL字符串拆分为数组

时间:2012-12-04 14:49:22

标签: javascript arrays multidimensional-array

我正在尝试打破像这样的字符串:

FNAME =账单&安培; MNAME =安培; L-NAME =琼斯&安培; ADDR1 =此%20House&安培; ...

我希望最终得到一个像这样的

索引的数组
myarray[0][0] = fname
myarray[0][1] = bill
myarray[1][0] = mname
myarray[1][1] = 
myarray[2][0] = lname
myarray[2][1] = jones
myarray[3][0] = addr
myarray[3][1] = This House

网址比例子长一点。这就是我尝试过的:

var
    fArray = [],
    nv = [],
    myarray = [];

fArray = fields.split('&');

// split it into fArray[i]['name']="value"
for (i=0; i < fArray.length; i++) {
    nv = fArray[i].split('=');
    myarray.push(nv[0],nv[1]);
    nv.length = 0;
}

最终产品的目的是在'myarray'中,除了我得到的是一维数组而不是二维数组。

下一个过程旨在搜索(例如)'lname'并返回它的索引,这样如果它返回'3',我就可以使用myarray [3] [1]访问实际的姓氏。

这是否有意义,还是我过于复杂化?

2 个答案:

答案 0 :(得分:1)

你的行myarray.push(nv[0],nv[1]);将两个元素推送到数组myarray,而不是一个包含两个元素的单元格(ref:array.push)。你想要的是myarray.push( [nv[0],nv[1]] )(注意括号),或myarray.push(nv.slice(0, 2))(参考:array.slice)。

为简化您的代码,我建议您使用Array.map

var q = "foo=bar&baz=quux&lorem=ipsum"; 
         // PS. If you're parsing from a-tag nodes, they have a property 
         // node.search which contains the query string, but note that 
         // it has a leading ? so you want node.search.substr(1)

var vars = q.split("&").map(function (kv) {
               return kv.split("=", 2);
           });

对于搜索,我建议使用array.filter

var srchkey = "foo";
var matches = vars.filter(function (v) { return v[0] === srchkey; });

NB。 array.filter将始终返回一个数组。如果您只想要一个值,则可以使用array.some或定制搜索算法。

答案 1 :(得分:1)

for (var i = 0; i < fArray.length; i++) {
    nv = fArray[i].split('=');
    myarray.push([nv[0],nv[1]]);
}

nv.length = 0;不是必需的,因为您在nv循环的每次迭代中都设置了for

另外,在var i循环中使用for,否则,您正在使用/分配全局变量i,这就是要求干扰。