2016-05-31 11 views
0

私はelasticsearchインスタンスにクエリを送信するnode.jsサーバーを実行しています。クエリによって返されたJSONの例を次に示します。elasticsearch autosuggest return tricky JSON

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 9290, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "suggest": { 
     "postSuggest": [ 
      { 
       "text": "a", 
       "offset": 0, 
       "length": 1, 
       "options": [ 
        { 
         "text": "Academic Librarian", 
         "score": 2 
        }, 
        { 
         "text": "Able Seamen", 
         "score": 1 
        }, 
        { 
         "text": "Academic Dean", 
         "score": 1 
        }, 
        { 
         "text": "Academic Deans-Registrar", 
         "score": 1 
        }, 
        { 
         "text": "Accessory Designer", 
         "score": 1 
        } 
       ] 
      } 
     ] 
    } 
} 

各ジョブのタイトルを含む配列を文字列として作成する必要があります。私は理解できないこの奇妙な行動にぶつかった。私がJSONから値を取り出そうとすると、私はoptions以下になることはできません。あるいはすべてが未定義に戻ってきます。例えば

arr.push(results.suggest.postSuggest)あなたが期待するものだけプッシュします:postSuggest内のすべてのもの。

arr.push(results.suggest.postSuggest.options)は、私が.optionsなしで実行したときに見ることができますが、未定義となります。これは.options以下にも当てはまります。

私は.optionsは変数に作用する組み込み関数のいくつかの並べ替えているので、代わりにJSONのようなオプションを見ての、代わりにresults.suggest.postSuggest

+2

'postSuggest'は、[配列(括弧、'であるusefuleすることができ、このスニペットの下options

の配列を取得するためにpostSuggest[0].optionspostSuggest[0]でpostSuggestを取得する必要があり、その後 ..] ')を使用しています(中括弧' {..} ')。最初に配列のインデックスにアクセスする必要があります - 'postSuggest [0] .options'。 - [アクセス/プロセス(ネストされたオブジェクト、配列またはJSON)](https://stackoverflow.com/questions/11922383/access-process-nested-objects-arrays-or-json) –

+0

問題が修正されました。ありがとうございます。私は配列ではないことを登録したことはありません。 – IanCZane

答えて

1

arr.push上で機能を実行しようとしているので、それがかもしれないと思います(results.suggest.postSuggest.options)

postSuggestはオブジェクトの配列です。 options inside postSuggestもオブジェクトの配列です。だから、最初のあなたは

var myObj = {..} 
// used jquery just to demonstrate postSuggest is an Array 
console.log($.isArray(myObj.suggest.postSuggest)) //return true 
var getPostSuggest =myObj.suggest.postSuggest //Array of object 
var getOptions = getPostSuggest[0].options; // 0 since it contain only one element 
console.log(getOptions.length) ; // 5 , contain 5 objects 
getOptions.forEach(function(item){ 
    document.write("<pre>Score is "+ item.score + " Text</pre>") 
}) 

Jsfiddle