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

如何使用JavaScript将带有参数的URL字符串拆分为数组,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,我试着把这样一根绳子断开: fname=bill&mname=&lname=jones&addr1=This%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 Hou

我试着把这样一根绳子断开:

fname=bill&mname=&lname=jones&addr1=This%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
url比示例长了很多。这就是我尝试过的:

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;
}
var
fArray=[],
nv=[],
myarray=[];
fArray=字段。拆分('&');
//将其拆分为fArray[i]['name']=“value”
对于(i=0;i
最终的产品是在“myarray”中,它是,除了我得到的是一维数组而不是二维数组

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


这有意义吗,还是我把事情复杂化了?

你的行
myarray.push(nv[0],nv[1])
将两个元素推送到数组
myarray
,而不是像您所期望的那样将两个元素放在一个单元格中(参考:)。您需要的是
myarray.push([nv[0],nv[1]])
(注意括号),或者
myarray.push(nv.slice(0,2))
(参考:)

为了简化您的代码,我建议您使用:

对于搜索,我建议使用:

注意。array.filter将始终返回一个数组。如果总是只需要一个值,可以使用或定制搜索算法。

for(var i=0;ifor (var i = 0; i < fArray.length; i++) {
    nv = fArray[i].split('=');
    myarray.push([nv[0],nv[1]]);
}
nv=fArray[i].分裂('='); myarray.push([nv[0],nv[1]]); }
nv.length=0
不是必需的,因为您正在为
循环的每次迭代中设置
nv


另外,在
for
-循环中使用
var i
,否则,您正在使用/分配一个全局变量
i
,这会请求干扰。

请欣赏。我已经按照您的建议将其转换为使用数组映射,现在我这样做了:alert(out.join(“|”);我得到:comp|u name,c78 v | addr1,| addr2,| addr3,| addr4,| zip,| vat|u exempt1,true | vat|u exempt0,false | ddcalled,selcustomers | ddcalled,selcustomers | tbl,customers | popup,1,这表明它起作用了,但据我所知,当我使用“out.indexOf('comp|u name')”时,它会返回“-1”而不是“0”,
indexOf
在多维数组上不起作用。谢谢@Cerbrus。真可惜!顺便说一句,很抱歉我无意中接受了你的答案,而我本打算接受下面的答案!我更新了它,因为我使用了他建议的array.map()解决方案,但也因为你的帮助,我对你的回答投了更高的票。@PeterSnow,用搜索部分修改了我的答案,我在第一轮中就错过了搜索部分。谢谢nikc.org,我制作了一个函数来实现这一点,但你的更好!但是,我希望将所需字段的索引提取到变量中,这样我就可以引用带有“out[lname][1]”而不是“out[2][1]”的元素。这是为了使它能够容忍url字符串中的更改。不幸的是,尽管我找不到将'lname'(etc)的键分配给变量的方法,所以看起来它又回到了绘图板上。不过谢谢,我了解了一些新的javascript函数@现在array.filter方法也将索引作为参数接收,我只是选择在示例中不使用它。正如文档(我在回答中链接到文档)中所述:“回调是通过三个参数调用的:元素的值、元素的索引和正在遍历的数组对象。”。如果您在
过滤器
/
一些
回调中返回
索引
的值,您将得到该值。
var srchkey = "foo";
var matches = vars.filter(function (v) { return v[0] === srchkey; });
for (var i = 0; i < fArray.length; i++) {
    nv = fArray[i].split('=');
    myarray.push([nv[0],nv[1]]);
}