Angular: Как деструктизировать код в конструкторе модели данных?

217
06 сентября 2018, 07:20

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. Как сделать так, чтобы уникнуть дублирование кода? Думал, вынести данную функцию в сервис, но еще такого не встречал, что сервис инжектируется в к конструктор модели? Как правильно сделать?

Answer 1

Во-первых, зачем выносить функцию в сервис, можно вынести функцию в отдельный файл. Во-вторых избегайте 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;
}

И этого достаточно

READ ALSO
Не подключется javascript

Не подключется javascript

Не подключается javascript, вот как его подключил(в конце тега body)(использую pug) script(src="https://cdnjscloudflare

261
Перебор объекта 2 массивов Handlebars + node.js

Перебор объекта 2 массивов Handlebars + node.js

Не могу решить задачу у меня есть JSON объект c 2 свойствами которые имею массивы

199