0

JavaScript で検索候補テキスト ボックス コントロールを作成しており、ユーザーが入力した文字列をユーザーの連絡先リストを表す JSON オブジェクトと比較する方法を見つけようとしています。

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

var contacts = {
    'gmail' : [
        { name : 'Joe Smith', email : 'joe.smith@gmail.com' },
        { name : 'James Simpson', email : 'jim.simpson@gmail.com' }
    ]    
}

JSONPath を使用して、ユーザーが入力した文字列を連絡先オブジェクトの 1 つのフィールドと比較することに成功しました (つまり、名前または電子メールをテストできます)。

var input = "james";

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

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

これは連絡先オブジェクトを返しますが{James Simpson}、James の代わりに Jim と入力した場合、2 つの個別の JSONPath クエリ (1 つは名前に対して、もう 1 つは電子メールに対して) を実行しない限り、何も返されません。

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

これは、私が探しているものを説明する疑似コード(動作していない)です。

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

これを行う方法を知っている人はいますか?

4

3 に答える 3

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 エバリュエーター ツールを調べてください。
http://www.defiantjs.com/#xpath_evaluator

于 2014-01-14T17:30:29.873 に答える
0

検索用語を連絡先名にマップする、より単純なデータ構造を作成します。連絡先の名前を取得したら、次を使用してレコード全体を検索しますjsonPath

于 2011-09-01T23:09:31.167 に答える