Angular/Typescript — сопоставление объекта с определенными пользователем свойствами

В настоящее время я работаю над компонентом в ng2, который должен представлять данные, предоставленные параметром (это будет массив объектов). Проблема в том, что имена свойств объектов в предоставленном массиве не всегда совпадают, т.е.

Массив 1:

{emplNo: 1, emplName: "John", emplCompany:"Volvo" }

и в другом сценарии Array2:

{employeeNo: 1, employeeName: "John", companyName:"Volvo" }

Моя идея состояла в том, чтобы создать входные свойства для каждого имени свойства, а затем каким-то образом использовать эти имена для сопоставления предоставленного массива с новым массивом со статическими свойствами и использовать этот новый массив для представления данных в моем компоненте примерно так:

interface mappedObjectInterface { 
  number: number,
  name: string,
  companyName: string
}

@Component({
  selector: 'my-component',
  template: `
    <div *ngFor="let item of mappedItemsSource">
        {{item.number}}, {{item.name}}, {{item.companyName}}
    </div>

  `
})
export class MyComponent implements OnInit {

@Input() ItemsSource: Array<Objects>; //provided Array
@Input() numberPropertyName: string;  // name of number property
@Input() namePropertyName: string;    // name of name property
@Input() companyNamePropertyName: string;    // name of companyName property
}

mapItemsSource(numberName, nameName, companyNameName) {
    let mappedItemsSource:mappedObjectInterface  = this.ItemsSource.map(item => ({
        number: item.numberName, //here I want to use the  property name provided by numberPropertyName input parameter
        name: item.nameName, //here I want to use the  property name provided by namePropertyName input parameter
        companyName: item.companyNameName, //here I want to use the  property name provided by campanynamePropertyName input parameter

    }));
}

ngOnInit() {        
    this.mapItemsSource(this.numberPropertyName, this.namePropertyName, this.companyNamePropertyName)
}

и пример кода для использования этого компонента будет выглядеть примерно так:

<my-component [ItemsSource]="Data"
              [numberPropertyName]="'emplNo'"
              [namePropertyName]="'emplName'"
              [companyPropertyName]="'emplCompanyName'">    
</my-component>

Может ли кто-нибудь сказать мне, является ли это правильным способом решения этой задачи или я должен сделать это по-другому? К сожалению, по мнению моего руководителя группы, создание интерфейса для управления предоставленной структурой ItemsSource не вариант. Компонент должен конвертировать массив самостоятельно.

Заранее спасибо!


person Morgoth    schedule 04.10.2017    source источник


Ответы (1)


Сделайте свой интерфейс необязательным для чего-то вроде этого

interface mappedObjectInterface { 
  emplNo?: number,
  employeeNo?: number,
  emplName?: string,
  employeeName?: string,
  companyName?: string,
  emplCompany?: string
}

Обновить

Если вы не уверены в типе ключа, который может прийти, единственное, что может вам здесь помочь, это не использовать интерфейс и обращаться к номерам индексов массива, т. е. 0, 1, 2.

person Rahul Singh    schedule 04.10.2017
comment
Я только что показал 2 примера имен свойств. Их может быть гораздо больше, и я не могу сказать, какие имена появятся в будущем. Даже если я сделаю необязательные свойства в интерфейсе, я все равно не знаю, какие свойства мне нужно отображать в моем шаблоне. - person Morgoth; 04.10.2017
comment
@Morgoth обновил ответ - person Rahul Singh; 04.10.2017