2017-04-08 61 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

相关问题