2017-04-08 65 views
-8

我想通過在搜索字段中將用戶輸入分解爲對象來嘗試在客戶端生成api查詢。javascript - 將搜索查詢字符串分解爲對象

例, 搜索查詢

arg1:"2 words" business corporate arg2:val2 

期望中的價值

{ 
    arg1: "2 words", 
    arg2: "val2", 
    extra: "business corporate" 
} 

我試着這樣做。

var query = initquery.split(' '); 
var obj = {}; 
for(var i=0; i<query.length; i++){ 
    var s = query[i].split(':'); 
    if(s.length == 2) { 
     initquery = initquery.replace(query[i], ''); 
     obj[s[0]] = s[1]; 
    } 
} 
obj.extra = initquery; 

這不處理引號中的字符串。

+0

字符串裏面只有arg1和arg2嗎?或者其他arg {i}:val {i}也是可能的? – jrook

+0

是的,其他參數也是可以的。 – rosinghal

+0

堆棧溢出要求你做你自己的工作。發佈問題是不夠的。編寫代碼並提出有關它的問題。 – Tomalak

回答

2

你可能想看看這個:

addEventListener('load', function(){ 
 

 
var wtf = 'arg1:"2 words" business corporate arg2:val2 arg3:"fixedIt"'; 
 
function customObj(string){ 
 
    var a = string.split(/\s+(?!\w+")/), x = [], o = {}; 
 
    for(var i=0,s,k,l=a.length; i<l; i++){ 
 
    s = a[i].split(/:/); k = s[0]; 
 
    s[1] ? o[k] = s[1].replace(/"/g, '') : x.push(k); 
 
    } 
 
    o['extra'] = x.join(' '); 
 
    return o; 
 
} 
 
console.log(customObj(wtf)); 
 

 
});

+0

感謝@PHPglue,在初始測試中工作正常。將測試更多用例並讓你知道。 – rosinghal

+0

'arg1:「2個字」商業企業arg2:val2 arg3:「notCatching」' – jrook

+0

我想我修好了嗎? – PHPglue

0

感謝@Barmar爲this helpful comment,我想出了這個正則表達式來趕上ARGS(假設他們後跟一個數字和一個冒號):

var pattern = /((^|\s)arg\d:").*?(?=")"?|(\sarg\d:\w*)/g; 

提取其餘查詢可以通過:

query.replace(pattern,""); 

然後創建最終對象應該很簡單。儘管如此,考慮到在查詢字符串中使用雙引號引起的複雜性,您應該考慮爲您的應用程序編寫解析器。

UPDATE: 更新的正則表達式匹配字符串的開始,只有經過空白字符匹配arg

相關問題