Карта rxjs создает дубликат - PullRequest
0 голосов
/ 09 ноября 2018

На этой карте я пытаюсь обновить массив по индексу. Кажется, это создает дубликат. Мысли

const updateAirport$ = this.updateAirportSubject$
    .pipe(
        filter(airport => !!airport),
        switchMap(airport => this.airportService.updateAirport(airport)),
        tap(airport => {
            this.snackBar.open(`${airport.name} updated`, null, snackBarConfig);
            this.saveStatus = 2;
        }),
        map(airport => {
            const index = this.airports.findIndex(item => item.id === airport.id);
            this.airports = [...this.airports, this.airports[index] = airport];
            return this.airports;
        }),
        tap(() => this.saveStatus = 0),
        shareReplay()
    );

и затем:

this.airports$ = airports$.pipe(
    merge(newAirport$, updateAirport$, uploadCSV$)
);

1 Ответ

0 голосов
/ 09 ноября 2018

Это сложно диагностировать, поскольку у меня нет полного решения, приведенный ниже анализ будет основан на некоторых предположениях с моей стороны, пожалуйста, исправьте меня, если ошиблись.

Ваша логика карты создает здесь неизменную копию индивидуального индекса.

this.airports = [...this.airports, this.airports[index] = airport];

Вывод этого затем объединяется здесь.

merge(newAirport$, updateAirport$, uploadCSV$)

Если логика в this.updateAirportSubject$ основана на копии newAirport$, вы помещаете неизменную копию обратно в себя ... если это так, удалите исходный индекс из newAirport$ перед объединением или измените оригинал без создания неизменной копии.

Редакция

Глядя на это поближе, я считаю, что эта логика является причиной вашей проблемы, мне не совсем ясно, чего вы пытаетесь достичь в этой строке.

  • Вы создаете неизменную копию this.airports и добавляете копия индекса на конце.

    this.airports = [...this.airports, this.airports[index] = airport];
    

Вы уже получили индекс здесь, используя airport.id

  const index = this.airports.findIndex(item => item.id === airport.id);

А затем используйте индекс, чтобы выполнить логическое сопоставление в аэропорту, чтобы убедиться, что индекс соответствует выданному значению, а затем добавьте в конец this.airports.

this.airports[index] = airport

Пример * ** 1 038 тысяча тридцать семь * логика ниже

array = [1,2,3,4,5,6,7,8,9]
  index;

  ngOnInit(){
    this.index = this.array.indexOf(4);
    this.array = [...this.array, this.array[this.index] = 4];
    console.log(this.array);
  }

приводит к этому выводу.

1,2,3,4,5,6,7,8,9,4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...