2016-08-29 1 views
0

私はelasticsearchクエリを構築しており、データ・サービスに送信する前にオブジェクト・テンプレートを使用してクエリのPOST本体を構築したいと考えています。テンプレートとして使用するconstオブジェクトを割り当てる方法

しかし、私がテンプレートを使用すると、私が宣言した実際のconstオブジェクトは変更され、それ以降テンプレートは壊れてしまいます。以下のコードでは、retunQuery値が変更されただけでなく、INIT_QUERY constの値も同じように変更されています。実際に値を変更せずに、このconstオブジェクトをテンプレートとして使用するにはどうすればよいですか。

const INIT_QUERY = { 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": <any>[] 
       } 
      } 
     } 
    } 
} 

const MATCH_QUERY = { 
    "match": <any>{} 
} 
... 

export class QueryBuilder { 

constructor() {} 

buildQuery() { 
    let returnQuery = INIT_QUERY; 
    .... loop 

    let query = MATCH_QUERY; 
    query.match[dbfield].query = 'fieldValueToSearch'; 

    returnQuery.query.filtered.filter.bool.must.push(query); 

    .... end loop 

    return returnQuery; 
} 

} 

答えて

1

let returnQuery = INIT_QUERY;だけINIT_QUERYへの別の参照を作成します。両方とも同じオブジェクトを参照します。

Object.assign({}, INIT_QUERY);は浅いコピーを作成するだけで十分ではありません。

「テンプレート」をJSONとして提供し、そこから新しいオブジェクトを作成するのが最も簡単な方法です。

これはintellisenseを中断します。インターフェイスを作成して型キャストを行う必要があります。

interface Query { 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": any[] 
     } 
     } 
    } 
    } 
} 
const INIT_QUERY = `{ 
    "query": { 
    "filtered": { 
     "filter": { 
      "bool": { 
       "must": [] 
      } 
     } 
    } 
}`; 
let query: Query = <Query>JSON.parse(INIT_QUERY); 
+0

この場合、インターフェイスの外観を詳しく説明できますか? – user1873196

+1

確かに、私は私の答えを編集しました。それはあなたのオブジェクトの構造だけです。 – j2L4e

+0

ありがとう!それは素晴らしい仕事でした。 – user1873196

関連する問題