我正在使用JavaScript构建搜索建议文本框控件,并且我正在尝试找到一种方法来比较用户键入的字符串与表示用户联系人列表的JSON对象。
JSON对象如下所示:
var contacts = {
'gmail' : [
{ name : 'Joe Smith', email : 'joe.smith@gmail.com' },
{ name : 'James Simpson', email : 'jim.simpson@gmail.com' }
]
}
使用JSONPath,我已经能够使用以下内容成功地比较用户键入的字符串与联系人对象中的单个字段(即我可以测试名称或电子邮件):
var input = "james";
var search_path = '$.*[?( /' + input + '/i.test(@.name))]';
var results = jsonPath(contacts ,search_path, {resultType:"VALUE"});
返回{James Simpson}
联系人对象,但是如果我键入了Jim而不是James,除非我执行了两个单独的JSONPath查询,一个针对名称,另一个针对电子邮件,否则它将不返回任何内容。
我正在寻找的是使用JSONPath执行OR运算符的优雅方法,因此我可以针对多个JSON属性值测试单个字符串。
这是psuedo-code (非工作),描述了我在寻找的内容:
var search_path = '$.*[?( /' + input + '/i.test([ @.name, @.email ]))]';
有谁知道这样做的方法?
答案 0 :(得分:0)
我会创建一个更简单的数据结构,将搜索词映射到联系人姓名。获得联系人姓名后,使用jsonPath
答案 1 :(得分:0)
更好的方法是使用DefiantJS(http://defiantjs.com)。此lib使用方法“search”扩展全局对象JSON - 使用该方法可以使用XPath表达式查询JSON结构。此方法返回数组中的匹配项(如果未找到匹配项,则为空)。
这是下面代码的工作JSfiddle;
http://jsfiddle.net/hbi99/z2Erf/
var data = {
"gmail": [
{
"name": "Joe Smith",
"email": "joe.smith@gmail.com"
},
{
"name": "James Simpson",
"email": "jim.simpson@gmail.com"
}
]
},
res = JSON.search( data, '//gmail[contains(., "jim")]' );
console.log( res[0].name );
// James Simpson
表达式'// gmail [contains(。,“jim”)]'将查找GMAIL下的所有字段,无论字段名称如何。要明确地将搜索限制为“name”和“email”字段,则查询应如下所示:
'//gmail[contains(name, "jim") or contains(email, "jim")]'
要了解XPath的强大功能,请查看此XPath Evaluator工具;
http://www.defiantjs.com/#xpath_evaluator
答案 2 :(得分:0)
如果您使用的是Goessner的解析器,则可以在表达式中使用||
运算符,如下所示:
var search_path = '$.*[?(/jim/i.test(@.name) || /jim/i.test(@.email))]';