我正在构建elasticsearch查询,并希望在发送到我的数据服务之前使用对象模板构建查询的POST主体。
第一次查询构建很好,但是,当我使用模板时,我声明的实际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;
}
}
答案 0 :(得分: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);