javascript - 将搜索查询字符串分解为对象
问题描述:
我想通过在搜索字段中将用户输入分解为对象来尝试在客户端生成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;
这不处理引号中的字符串。
答
你可能想看看这个:
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));
});
答
感谢@Barmar为this helpful comment,我想出了这个正则表达式来赶上ARGS(假设他们后跟一个数字和一个冒号):
var pattern = /((^|\s)arg\d:").*?(?=")"?|(\sarg\d:\w*)/g;
提取其余查询可以通过:
query.replace(pattern,"");
然后创建最终对象应该很简单。尽管如此,考虑到在查询字符串中使用双引号引起的复杂性,您应该考虑为您的应用程序编写解析器。
UPDATE: 更新的正则表达式匹配字符串的开始,只有经过空白字符匹配arg
。
字符串里面只有arg1和arg2吗?或者其他arg {i}:val {i}也是可能的? – jrook
是的,其他参数也是可以的。 – rosinghal
堆栈溢出要求你做你自己的工作。发布问题是不够的。编写代码并提出有关它的问题。 – Tomalak