1

我需要一个查询字符串(例如:?name=value1&type=value2&name=value3&type=value4...,但此代码应该能够处理传递给它的任何查询字符串)并从中创建一个对象。QueryString Javascript集合对象能够处理数组

我已经差不多完成了这个功能。但是,我的逻辑在最后一个循环内有点偏离。如果有人能指出我出错的地方,我会非常感激!

首先我抓住使用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] 
+1

那么,用'paramObject [key] = value;'和'var existingValue = paramObject [key];'你基本上在做'var existingValue = value'不是吗? – pimvdb 2012-03-01 11:28:40

+0

我已经解决了我自己的问题大声笑... – 2012-03-01 12:47:28

+0

谢谢 - 抱歉,不是故意只说'我解决了它'...堆栈不会让我在这里发布答案。我添加它作为我的问题的一个笔记。 – 2012-03-01 12:55:04

回答

2

够酷又不想一个基于正则表达式的实现,我认为这将是有帮助的,以显示它的样子:

params = {} 
queryString.replace(/([^&=]+)=([^&=]*)/g, function($0, $1, $2) { 
    (params[$1] = params[$1] || []).push($2); 
}); 
// that's basically all about this 

(不回答这个问题,因此CW)。