我需要获取一个查询字符串(例如:?name=value1&type=value2&name=value3&type=value4...
,但此代码应该能够处理传递给它的任何查询字符串)并从中创建一个对象。
我差不多完成了这个功能。但是,我的逻辑在最后一个循环中有点偏离。如果有人可以请指出我出错的地方,我真的很感激!
首先,我使用jQuery的$.get
函数获取查询字符串:
$.get("xmlreader.php", function(data) {
var queryParams = [];
var qString = data;
// test qString for & at the end
var last = qString.lastIndexOf("&");
if(last == qString.length - 1) {
// then there is a & to remove
qString = qString.substring(0,qString.length-1);
}
getParamObj(qString);
});
(我知道在我的JavaScript中移除最后一个&这是很时髦的但是我根本不想关注它。)
然后我调用getParamObject(qString);
来构建实际的集合对象:
function getParamObj(parameterString) {
var qString = parameterString;
var parameters = qString.split("&");
parameters[0] = parameters[0].substring(1);
var paramObject = new Object();
for(var index = 0; index < parameters.length; ++index) {
var equalsPos = parameters[index].indexOf("=");
var key = parameters[index].substring(0,equalsPos);
var stringLength = parameters[index].length;
var value = parameters[index].substring(equalsPos + 1, stringLength);
if(!paramObject[key]) {
console.log("paramObject[key] = " + paramObject[key]);
paramObject[key] = value;
if(paramObject[key] instanceof Array ) {
console.log("instance of array");
paramObject[key].push(value);
} else {
var newArray = [];
var existingValue = paramObject[key];
console.log("existing value: " + existingValue);
console.log("value: " + value);
newArray.push(existingValue);
newArray.push(value);
paramObject[key] = newArray;
}
}
}
该功能正常工作。当我测试它时,有些事情是错误的:在最后一个条件中,existingValue和value是相同的。可能还有其他问题,但我认为这是主要问题。
我见过使用正则表达式的方法,但我不想在这里采用这条路线。
注意:我已经回答了我自己的问题LOL ...堆栈不会让我评论这个因为我还不够酷,只有58代表:)
[code]
if(!paramObject[key]) {
console.log("paramObject[key] = " + paramObject[key]);
paramObject[key] = value;
console.log("paramObject[key] = value = " + value + paramObject[key]);
console.log(paramObject[key]);
}
else if(paramObject[key] instanceof Array ) {
paramObject[key].push(value);
console.log("value if arra" + value);
} else {
var newArray = [];
var existingValue = paramObject[key];
console.log("existing value: " + existingValue);
console.log("value: " + value);
newArray.push(existingValue);
newArray.push(value);
paramObject[key] = newArray;
}
[/code]
答案 0 :(得分:2)
虽然你说你不想要一个基于正则表达式的实现,但我认为显示它的外观会很有帮助:
params = {}
queryString.replace(/([^&=]+)=([^&=]*)/g, function($0, $1, $2) {
(params[$1] = params[$1] || []).push($2);
});
// that's basically all about this
(不回答问题,因此CW)。