2011-08-10 21 views
0

JavaScriptで検索候補のテキストボックスコントロールを作成しています。ユーザーが入力した文字列と、ユーザーの連絡先リストを表すJSONオブジェクトを比較する方法を探しています。JSONPathを使用して文字列を複数のJSONプロパティ値と比較する

JSONオブジェクトは、次のようになります。

JSONPathを使用して
var contacts = { 
    'gmail' : [ 
     { name : 'Joe Smith', email : '[email protected]' }, 
     { name : 'James Simpson', email : '[email protected]' } 
    ]  
} 

、私は成功し、ユーザーが連絡先オブジェクト内の単一のフィールドに対して入力された文字列を比較することができました(つまり、私は名前をテストすることができます。 、または電子メール)を使用して、以下:{James Simpson}連絡先オブジェクトを返しますが、私が代わりにジェームズのジムを入力した場合、私は二つの別々のJSONPathクエリやっていない限り、それは何も返さないだろう

var input = "james"; 

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

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

- 名に対して1と他の人はメールに反対します。

私が探しているのは、JSONPathでOR演算子を実行するためのエレガントな方法です。複数のJSONプロパティ値に対して1つの文字列をテストできます。

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

これを行う方法のいずれかを知っています:どのような私が探していることを説明し

ここで擬似コード(非稼働)があります

答えて

0

私は、検索用語を連絡先名にマップする、より簡単なデータ構造を作成します。連絡先の名前を取得したら、jsonPath

0

を使用してください。より良い方法は、DefiantJS(http://defiantjs.com)を使用することです。このlibは、グローバルオブジェクトJSONをメソッド "search"で拡張します。このメソッドを使用すると、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の下にあるすべてのフィールドを検索します。明示的にフィールド「名前」と「メール」に対して検索を収縮するために、その後、クエリは次のようになります。XPathがいかに強力であるかのアイデアを取得するには

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

、このXPathの評価者ツールをチェックしてください。
http://www.defiantjs.com/#xpath_evaluator

0

あなたはGoessnerのパーサを使用している場合は、次のように、あなたはあなたの式で||演算子を使用することができます。

var search_path = '$.*[?(/jim/i.test(@.name) || /jim/i.test(@.email))]'; 
関連する問題