export class Street {
glob_id: string;
id: string;
is_edited: string;
parents_levels: Array<number>;
parents_names: Array<string>;
name: string;
region_id: string;
region: string;
county: string;
area: string;
city: string;
city_district: string;
place: string;
street: string;
additional_territory: string;
additional_territory_subject: string;
constructor(street?) {
street = street || {};
this.glob_id = street.glob_id || '';
this.id = street.glob_id || '';
this.is_edited = street.is_edited || '';
this.name = street.name || '';
this.parents_names = JSON.parse(street.parents_names) || [];
this.parents_levels = JSON.parse(street.parents_levels) || [];
this.region_id = street.region_id || [];
for (let i = 0; i < this.parents_levels.length; i++) {
switch (+this.parents_levels[i]) {
case 1:
this.region = this.parents_names[i];
break;
case 2:
this.county = this.parents_names[i];
break;
case 3:
this.area = this.parents_names[i];
break;
case 4:
this.city = this.parents_names[i];
break;
case 5:
this.city_district = this.parents_names[i];
break;
case 6:
this.place = this.parents_names[i];
break;
case 90:
this.additional_territory = this.parents_names[i];
break;
case 91:
this.additional_territory_subject = this.parents_names[i];
break;
}
}
}
}
Дело в том, что нужно сделать еще несколько сущностей, к примеру Сity
, Region
и т.д. В каждой сущности повторяется конструкция switch case
. Как сделать так, чтобы уникнуть дублирование кода? Думал, вынести данную функцию в сервис, но еще такого не встречал, что сервис инжектируется в к конструктор модели? Как правильно сделать?
Во-первых, зачем выносить функцию в сервис, можно вынести функцию в отдельный файл. Во-вторых избегайте magic numbers
, Ваш код теряет читабельность, для этого лучше используйте const enum
, можете вынести его в отдельный файл для того, чтобы сделать reusable
:
export const enum ParentLevels {
Region = 1,
Country = 2,
Area = 3,
City = 4,
CityDistrict = 5,
Place = 6,
AdditionalTerritory = 90,
AdditionalTerritorySubject = 91
}
Если у Вас данная конструкция switch-case
повторяется, можете попробовать ключи вынести в Map
:
export const getKeyMap = <T>(): Map<number, keyof T> => {
return new Map<number, any>([
[ParentLevels.Region, 'region'],
[ParentLevels.Country, 'county'],
[ParentLevels.Area, 'area'],
[ParentLevels.City, 'city'],
[ParentLevels.CityDistrict, 'city_district'],
[ParentLevels.Place, 'place'],
[ParentLevels.AdditionalTerritory, 'additional_territory'],
[ParentLevels.AdditionalTerritorySubject, 'additional_territory_subject'],
]);
};
Далее в конструкторе:
const keyMap = getKeyMap<Street>();
for (let i = 0; i < this.parent_levels.length; i++) {
const id = Number(this.parent_levels[i]);
const key = keyMap.get(id);
if (key !== undefined) {
this[key] = this.parent_names[i];
}
}
Но в случае если у Вас в каждой модели ключи будут разные, то максимум, что можно сделать это:
const id = Number(this.parents_levels[i]);
const parentName = this.parents_names[i];
switch (id) {
case ParentLevels.Region:
this.region = parentName;
break;
case ParentLevels.Country:
this.county = parentName;
break;
case ParentLevels.Area:
this.area = parentName;
break;
case ParentLevels.City:
this.city = parentName;
break;
case ParentLevels.CityDistrict:
this.city_district = parentName;
break;
case ParentLevels.Place:
this.place = parentName;
break;
case ParentLevels.AdditionalTerritory:
this.additional_territory = parentName;
break;
case ParentLevels.AdditionalTerritorySubject:
this.additional_territory_subject = parentName;
break;
}
И этого достаточно
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Не подключается javascript, вот как его подключил(в конце тега body)(использую pug) script(src="https://cdnjscloudflare
Не могу решить задачу у меня есть JSON объект c 2 свойствами которые имею массивы