angular - Typescript - Hur man sätter värdet på en objektnyckel i en Map


Jag har en karta som tar en föreläsning som nyckel och en array av uppgifter som värde.

lecturesWithTodos: Map<Lecture, Todos[]> = new Map<Lecture, Todos[]>();

Nu sätter jag först nyckeln på denna karta utan något värde (eftersom jag hämtar Todos senare).

student.semester.lectures.forEach((lecture) => {
    this.lecturesWithTodos.set(lecture, []);
});

Nu skulle jag bara vilja ställa in mina Att göra till dess specifika nyckel.

todos.forEach((todo) => {
   this.lecturesWithTodos.get(lecture).push(todo);
});

Men vid det här laget säger det alltid "Kan inte läsa egenskapen 'push' av undefined". Jag vet att jag kan få det gjort när jag använder en sträng som nyckel, men jag skulle vilja använda mitt objekt istället, eftersom det gör saker enklare för mig senare.

Finns det ett sätt att få get-metoden att fungera på detta föreläsningsobjekt?

Svar #1

Även om det skulle vara svårt att hämta element från kartan senare, är ett sätt att uppnå ditt mål illustrerat nedan.


Förutsatt att dina typer är som följer (ändra dem enligt ditt behov)

interface Todos {
  id: number;
  name: string;
}

interface Lecture {
  id: number;
  name: string;
}

De givna uppgifterna:

 lectures: Lecture[] = [
    { id: 100, name: 'ENG' },
    { id: 200, name: 'PHY' },
    { id: 300, name: 'BIO' }
  ];

  todos: Todos[] = [
    { id: 100, name: 'Add' },
    { id: 100, name: 'Sub' },
    { id: 300, name: 'Mul' }
  ];

Logik för att skapa kartan

ngOnInit() {
   this.lectures.forEach(lecture => {
      this.lecturesWithTodos.set(lecture, []);
   });

   this.todos.forEach(todo => {
      const findLecture = this.findById(todo.id);
      const findAllTodos = this.findTodos(todo.id);

      if (findLecture && findAllTodos) {
        // implies that there is a previous todo added earlier
        this.lecturesWithTodos.set(findLecture, [...findAllTodos, todo]);
      } else if (findLecture) {
        // implies that its a new todo being set
        this.lecturesWithTodos.set(findLecture, [todo]);
      }
  });

}

/** Used to find Lecture based on todo id **/
findById(id: number) {
    return Array.from(this.lecturesWithTodos.keys()).find(e => e.id === id);
}

/** Used to find all previous todos based on todo id **/
findTodos(id: number) {
    // todos is a 2D array
    let todos = Array.from(this.lecturesWithTodos.values());

    // convert to 1D array for finding values from it
    return [].concat.apply([], todos).filter(e => e.id === id);
}