Удалить элемент в списке интерфейсов машинописного текста при наличии записи, всегда отображающей отрицательный индекс

У меня есть интерфейс:

export interface ISchoolsPreview {
    // Shared
    AgeID: string;
    School_name?: string;
}

У меня есть функция, запускаемая изменением флажка:

onChange(code: string, name: string, check: boolean): void {
    const tempPreview: ISchoolsPreview = {AgeID: code, School_name: name};

    if (check) {
      this.schoolsPreview.push(tempPreview);

    } else {
      //This is where the error lies
      const index = this.schoolsPreview.indexOf(tempPreview);
      if (index > -1) {
        this.schoolsPreview.splice(index, 1);
      }

    }
}

Проверка определяется тем, был ли флажок установлен или снят. Если этот флажок установлен, он добавляет новый элемент ISchoolsPreview в schoolsPreview. Это работает, и когда я прохожу через это, он появляется и правильно отображается на моем интерфейсе.

Однако, когда я снимаю флажок, indexOf (tempPreview) всегда возвращает -1, даже если я передаю ту же запись.

Как правильно удалить элемент из моего списка интерфейсов

Думаю, ваш вопрос касается indexOf. Поскольку вы пытаетесь сравнивать объекты, важно понимать, что indexOf fn в javascript не использует глубокое сравнение. Кто-то еще предлагал решение по другому вопросу: stackoverflow.com/questions/12604062/…. Надеюсь, это поможет!

K.F 10.06.2018 05:43

Возможный дубликат Почему Array.indexOf не находит идентично выглядящие объекты

georgeawg 10.06.2018 07:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
97
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я исправил это, изменив:

  const index = this.schoolsPreview.indexOf(tempPreview);

к:

  const index = this.schoolsPreview.findIndex(s => s.AgeID === code);
Ответ принят как подходящий

Вы всегда должны находить индекс объекта на основе некоторого свойства в объекте, а не использовать сам объект целиком, как показано ниже.

const index = this.schoolsPreview.findIndex((obj) => obj['Property'] === code);

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

Примечание: Я не уверен в этом, но передаю объект в индекс, а возвращает true, только если объект ссылается на ту же самую память. Если вы пытаетесь найти новый объект, находящийся в новой памяти, он может вернуть false. Кто-нибудь может поправить меня в этом.

Другие вопросы по теме