我很好奇是否有更好的方法或方法来编写以下代码。
private buildQueryParams(filterData: BaseFilterModel | RegistrationFilterModel): HttpParams {
let params = new HttpParams();
if (filterData) {
if (filterData.regionId) {
params = params.set('regionId', filterData.regionId.toString());
}
if (filterData.facilityId) {
params = params.set('facilityId', filterData.facilityId.toString());
}
if (filterData.dept1 && filterData.dept1.id) {
params = params.set('dept1', filterData.dept1.id.toString());
}
if (filterData.dept2 && filterData.dept2.id) {
params = params.set('dept2', filterData.dept2.id.toString());
}
if (filterData.role && filterData.role !== 'All') {
params = params.set('role', filterData.role);
}
if ((<RegistrationFilterModel>filterData).registrationDate) {
params = params.set('registrationDate', (<RegistrationFilterModel>filterData).registrationDate.toString());
}
if ((<RegistrationFilterModel>filterData).activeStatus
&& (<RegistrationFilterModel>filterData).activeStatus !== ActiveStatus.All) {
params = params.set('activeStatus', (<RegistrationFilterModel>filterData).activeStatus.toString());
}
}
return params;
}
这基本上是基于具有这些设置值的对象(filterData)为http请求创建参数。我们将这个对象用于具有相似但略有不同的参数的多个端点,因此它遍历每个if语句以确保regionId,facilityId等。不是空的。
有没有更好的方法来实现这一点,而不是如果我们添加更多参数,可以获得更大和更大的if语句列表。
答案 0 :(得分:1)
您可以使用以下内容减少一些行:
var fields = ['regionId','facilityId','dept1','dept2'];
for (let field of fields) {
if (filterData[field]){
params = params.set(field, filterData[field].toString());
}
}
或用战略模式的具体战略管理每个案例。
答案 1 :(得分:1)
您可以使用测试来定义本地函数以执行实际设置,以避免null或undefined(或空字符串)并在需要时转换为字符串。类似的东西:
private buildQueryParams(filterData: BaseFilterModel | RegistrationFilterModel): HttpParams {
let params = new HttpParams();
function setparam(name: string, value: number|string) {
if (value) params = params.set(name, value.toString());
}
if (filterData) {
setparam('regionId', filterData.regionId);
setparam('facilityId', filterData.facilityId);
setparam('dept1', filterData.dept1 && filterData.dept1.id);
setparam('dept2', filterData.dept2 && filterData.dept2.id);
if (filterData.role != 'All') {
setparam('role', filterData.role);
}
setparam('registrationDate', (<RegistrationFilterModel>filterData).registrationDate);
if ((<RegistrationFilterModel>filterData).activeStatus !== ActiveStatus.All) {
setparam('activeStatus', (<RegistrationFilterModel>filterData).activeStatus);
}
}
return params;
}
value
的实际类型应与预期类型匹配,甚至可以是any
。
答案 2 :(得分:0)
Lodash是要走的路:
var object = {
'a': [{
'b': {
'c': 100
},
'd': 'MARKS'
}]
};
console.log(_.get(object, ['a', '0', 'b', 'c']));
console.log(_.get(object, ['a', '0', 'd']).toLowerCase()); // Do operation on the object found
console.log(_.get(object, ['a', '0', 'foo'], 'granted')); // Specify default value, if incorrect path
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
看一下文档:
解释
答案 3 :(得分:0)
更多面向对象的方式就是做这样的事情。
enum ActiveStatus {
ALL
}
class Department {
constructor(private _id: number){}
public toString() {
return this._id.toString();
}
}
class Role {
private _name: "ALL";
public toString() {
return this._name == "ALL" ? "" : this._name;
}
}
class FilterData {
constructor(
private _regionId: number,
private _facilityId: number,
private _dep1: Department,
private _dep2: Department,
private _activeStatus: ActiveStatus
) {
}
public toHttpParams() {
let params = new HttpParams();
Object.keys(this).forEach((key) => {
let value = this[key].toString();
value && params.set(key.slice(1), value);
});
return params;
}
}
let filterData = new FilterData(
1,
2,
new Department(5),
new Department(7),
ActiveStatus.ALL
);
console.log(filterData.toHttpParams());
答案 4 :(得分:0)