Построить объект]] на основе набора данных - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть список необработанных данных, например, следующий за mockData, и мне нужно сгенерировать их в формате object [], некоторые необязательные пары ключ-значение необходимы из необработанных данных, таких как first, last, state. но некоторые пары ключ-значение являются опцией, подобной псевдониму. В конце концов, мне нужно создать массив объектов с таким же значением ключа, как необработанные данные, и значение какого-либо ключа зависит от значения другого ключа, такого как полное имя, адрес. Есть ли лучший способ для меня сделать это и сделать это более динамично? потому что у меня будет более 20 различных значений ключа, таких как полное имя, адрес, который должен быть построен с помощью некоторой функции, связанной с необработанными данными, я не хочу создавать много полного имени, тип адреса кода

export const mockData: Human[] = [
  {
    first: 'name1',
    last: 'v1',
    state: 'ny',
  },
  {
    first: 'name2',
    last: 'v2',
    state: 'pa',
    nickname: 'rocketman',
  }]

export interface Human {
  first: string;
  last: string;
  state: string;
  nickname?: string;
}

export interface Student extends Human{
  fullname: string;
  address: string;
}

function setFullName(first: string, last: string): string {
    return `${first} ${last}`
}

function setAddress(first: string, last: string, state: string): string {
    return `${first} ${last} live a ${state}`
}

function buildStudentData(jsons: Human[]): Student[] {
  return jsons.map((json) =>  <Student> {
      first: json.first,
      last: json.last,
      nickname:  json.hasOwnProperty('nickname') ? json.nickname : json.first,
      fullname: setFullName(json.first, json.last),
      address: setAddress(json.first, json.last, json.state)})
}


console.log(buildStudentData(mockData));

1 Ответ

0 голосов
/ 08 февраля 2020

Как насчет создания класса, где вычисляемые поля являются геттерами:

export class Student implements Human {
  public readonly first: string;
  public readonly last: string;
  public readonly state: string;
  public readonly nickname?: string;

  constructor(json: Human) {
    this.first = json.first;
    this.last = json.last;
    this.state = json.state;
    this.nickname = json.nickname;
  }

  public get fullName() {
    return `${this.first} ${this.last}`;
  }

  public get address() {
    return `${this.first} ${this.last} live a ${this.state}`;
  }
}

function buildStudentData(jsons: Human[]): Student[] {
  return jsons.map(json => new Student(json));
}
...