我正在尝试打破像这样的字符串:
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]访问实际的姓氏。
这是否有意义,还是我过于复杂化?
答案 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
,这就是要求干扰。