2016-08-29 2 views
0

Ich konstruiere Elasticsearch-Abfragen und möchte Objektvorlagen für den Aufbau des POST-Rumpfs der Abfragen verwenden, bevor ich an meinen Datendienst sende.wie man ein const-Objekt als Vorlage verwendet

Die Abfrage baut großartig das erste Mal jedoch, wie ich die Vorlagen verwende, die tatsächlichen const Objekte, die ich deklariert habe, werden geändert, und die Vorlage ist danach gebrochen. Im folgenden Code wird nicht nur der retunQuery-Wert geändert, sondern der Wert von INIT_QUERY const wird ebenfalls geändert. Wie kann ich dieses const-Objekt als Vorlage verwenden, ohne seinen Wert zu ändern?

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; 
} 

} 

Antwort

1

let returnQuery = INIT_QUERY; schafft nur einen weiteren Hinweis auf INIT_QUERY. Beide beziehen sich auf das gleiche Objekt.

Object.assign({}, INIT_QUERY); wird nur eine flache Kopie erstellen, so wird es nicht genug sein.

Der einfachste Weg, den ich sehe, besteht darin, Ihre "Vorlage" als JSON bereitzustellen und daraus neue Objekte zu erstellen.

Dies wird jedoch Intellisense zu brechen. Sie müssen eine Schnittstelle erstellen und eine Typumwandlung durchführen.

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

Können Sie näher erläutern, wie die Schnittstelle in diesem Fall aussehen würde? – user1873196

+1

Sicher, ich habe meine Antwort bearbeitet. Es ist nur die Struktur deines Objekts. – j2L4e

+0

Danke! Das hat super funktioniert. – user1873196

Verwandte Themen