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)。