2011-08-10 39 views
0

我在JavaScript中構建搜索建議文本框控件,並試圖找到一種方法來比較用戶輸入的字符串與代表用戶聯繫人列表的JSON對象。使用JSONPath比較具有多個JSON屬性值的字符串

JSON對象看起來是這樣的:

var contacts = { 
    'gmail' : [ 
     { name : 'Joe Smith', email : '[email protected]' }, 
     { name : 'James Simpson', email : '[email protected]' } 
    ]  
} 

使用JSONPath,我已經能夠成功地比較字符串類型針對的聯繫人(即我可以測試名稱的單場用戶。 ,或使用電子郵件)以下:

var input = "james"; 

var search_path = '$.*[?(/' + input + '/i.test(@.name))]'; 

var results = jsonPath(contacts ,search_path, {resultType:"VALUE"}); 

它返回{James Simpson}接觸的對象,但如果我輸入了吉姆而不是詹姆斯,除非我做了兩個獨立的JSONPath查詢將返回什麼 - 一個反對的名稱和其他反對電子郵件。

我在看什麼是一個優雅的方式來做與JSONPath的OR運算符,所以我可以測試一個字符串對多個JSON屬性值。

這裏是僞代碼(非工作)描述我正在尋找:

var search_path = '$.*[?(/' + input + '/i.test([ @.name, @.email ]))]'; 

有誰知道的方式做到這一點?

回答

0

我會創建一個更簡單的數據結構,將搜索條件映射到聯繫人姓名。一旦你有聯繫人姓名,查找整個記錄使用jsonPath

0

更好的方法是使用DefiantJS(http://defiantjs.com)。該lib使用「搜索」方法擴展了全局對象JSON,您可以使用它查詢帶有XPath表達式的JSON結構。此方法返回數組中的匹配項(如果未找到匹配項,則爲空)。

這裏是一個工作JSFiddle下面的代碼;
http://jsfiddle.net/hbi99/z2Erf/

var data = { 
     "gmail": [ 
      { 
      "name": "Joe Smith", 
      "email": "[email protected]" 
      }, 
      { 
      "name": "James Simpson", 
      "email": "[email protected]" 
      } 
     ] 
    }, 
    res = JSON.search(data, '//gmail[contains(., "jim")]'); 

console.log(res[0].name); 
// James Simpson 

表達'//的Gmail [含有(。, 「吉姆」)]'會發現GMAIL下的所有字段無論字段名。要明確收縮搜索到的領域「名」和「電子郵件」,那麼查詢應該是這樣的:

'//gmail[contains(name, "jim") or contains(email, "jim")]' 

要獲得多麼強大XPath是,看看這個XPath計算器工具的想法;
http://www.defiantjs.com/#xpath_evaluator

0

如果您正在使用Goessner的解析器,你可以使用||運算符表達式如下:

var search_path = '$.*[?(/jim/i.test(@.name) || /jim/i.test(@.email))]';