Получить уникальные родительские элементы из массива, используя Typescript - PullRequest
0 голосов
/ 29 мая 2019

У меня есть такая структура в моем угловом проекте:

export interface Campo {
  id?: number;
  nome?: string;
  tabela?: Tabela;
  campos?: Campo[];
}

export interface Tabela {
  id?: number;
  name?: string
  arquivo?: Arquivo;
}

export interface Arquivo {
  id?: number;
  name?: string;
  tabelas?: Tabela[];
}

, т. Е. У «Арквиво» много «Табел», а у «Табелы» много «Кампо».Я подписываюсь на сервис, который возвращает все «Campo», и я сохраняю его в переменной «campos».Этот сервис возвращает более 200 «Кампос», связанных примерно с 10 «Табелами» и только 3 «Арквивос».

Я хочу вернуть все уникальные «Арквиво» (т.е. все 3 «Арквиво»).

Когда я делаю:

let arquivos = this.campos
        .map(campo => campo.tabela.arquivo.id)
        .filter((value, index, self) => self.indexOf(value) === index);

Возвращает

[1001, 1002, 1003]

Так что это идентификаторывсе 3 "Arquivo", которые у меня есть.Но я не хочу идентификаторы, я хочу объекты "Arquivo".Когда я пытаюсь:

let arquivos = this.campos
        .map(campo => campo.tabela.arquivo)
        .filter((value, index, self) => self.indexOf(value) === index);

Возвращает более 200 регистров, потому что у меня более 200 «Кампос», и он не может знать, является ли «Аркивос» уникальным или нет.

Как я могу это сделать?

1 Ответ

1 голос
/ 29 мая 2019

Вы можете попробовать сопоставить уникальные идентификаторы arquivo с объектами arquivo, а затем получить значения

let arquivos = Object.values(this.campos
  .map(campo => campo.tabela.arquivo)
  .reduce((totals, arquivo) => {
    if (!totals[arquivo.id]) {
      totals[arquivo.id] = arquivo;
    }
    return totals;
  }, {})
);
...