Нет обратного «фильтра», поэтому фильтр не изменяет исходный массив, а возвращает новый массив. Так что, где ваш код работает неправильно, вы переопределяете «исходный код» отфильтрованной версией. Таким образом, вам придется снова получать полный исходный код из своего API, что является пустой тратой, поскольку, скорее всего, оно не изменилось.
Теперь, я предполагаю, что исходя из структуры вашего приложения, оно не тот же компонент, который делает фильтрацию и отображение найденных следов, может быть? В любом случае, не бойтесь хранить дополнительный массив того, что отображается в данный момент.
Таким образом, ваш поток данных может быть:
Получить полный список из API, сохранить в rawTrails AND FilterTrails (в компонент вашего приложения)
Пользователи что-то набирают
Создают подмножество из rawTrails и сохраняют в FilterTrails (используйте это для отображения этого списка или чего-то еще, что вы делаете)
Пользователь вводит что-то еще или очищает свой фильтр
Установить фильтрTrails = rawTrails
Другой вариант - просто отфильтровать необработанный список при каждом рендере (использование торговой памяти для загрузки ЦП)