1

我正在尝试分解这样的字符串:

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;
}

最终产品旨在位于“myarray”中,但我得到的是一维数组而不是二维数组。

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

这是有道理的还是我把事情复杂化了?

4

2 回答 2

1

您的行将myarray.push(nv[0],nv[1]);两个元素推送到 array myarray,而不是您期望的具有两个元素的单个单元格(参考: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; });

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

于 2012-12-04T14:54:40.793 回答
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 ifor-loop 中使用,否则,您正在使用 / 分配一个全局变量i,这要求干扰。

于 2012-12-04T14:58:33.773 回答