Последовательное, четко заданное удаление элементов из массива JS

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

ЗАДАЧА:

Объявлена переменная atTheOldToad.

Значение свойства atTheOldToad.potions это массив ["Speed potion", "Dragon breath", "Stone skin"].

После первого вызова метода atTheOldToad.removePotion("Dragon breath"), в свойстве potions будет массив ["Speed potion", Stone skin"].

После второго вызова метода atTheOldToad.removePotion("Speed potion"), в свойстве potions будет массив ["Stone skin"].

Моё решение - не даёт ответа на два последовательных вызова указанного метода:

const atTheOldToad = {
  potions: ["Speed potion", "Dragon breath", "Stone skin"],
  removePotion(potionName) {
    // Change code below this line
    **this.potions.splice(1, 1);**   //моё решение
    // Change code above this line
  },
};

Как сделать, чтобы при втором вызове удалить значение “Speed potion” - не понимаю. Можете подсказать, хотя бы направление решения?

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

Задача реализации removePotion сводится к 2-м шагам:

  1. Найти индекс зелья в массиве
  2. Использовать этот индекс в splice чтобы зелье было удалено
1 лайк

я правильно понял Вашу мысль - сначала перебираем существующий массив, последовательно сравнивая значения с предполагаемым удаляемым именем и при совпадении - удаляем именно необходимое нам? Сейчас пришлю код, как я его понял

Не до конца то что я представлял когда описывал идею. Я не знаю всех последствий итерации по массиву и изменению массива в этой же итерации и не советовал бы писать такой код.

Первый шаг - найти индекс элемента в массиве. Метод массива indexOf делает то что надо. Перебор по всем элементам массива для поиска индекса искомого тоже сработает но будет неоптимальным.

Второй шаг - удалить элемент из массива с этим индексом.

Эти шаги как бы “изолированы” друг от друга. Они решаются как бы отдельно друг от друга. Вместе сводятся через переменную типа “индексИскомогоЗелья”, куда первый шаг записывает свой результат, и которую второй шаг использует в splice.

Лирика №1. Одна эвристика которая мне помогала когда я только начинал это сформулировать чего мне надо достичь (найти индекс элемента массива) а потом проглядеть все методы и посмотреть какие из них делают то что мне надо (тебе могут показаться полезными методы типа indexOf или find. Списки методов с их описанием лучше годно оформлены на MDN: Array - JavaScript | MDN

Лирика №2. Разбитие задачи на отдельные изолированные шаги это то что тебе нужно научиться делать сразу же после изучения массивов-функций-переменных-условий. Гиганские проекты, маленькие проекты, даже функции - все они состоят из относительно изолированных решений, сводящихся очевидным образом вместе (проекты через АПИ, функции - через вызовы других функций или значения в переменных).

1 лайк

BINGO!!!
Не знаю, говорил ли Вам кто то это раньше, но Ваши объяснения реально дают понимание.
Вот что у меня получилось. И автопроверка пропустила:
const atTheOldToad = {
potions: [“Speed potion”, “Dragon breath”, “Stone skin”],
removePotion(potionName) {
// Change code below this line
const indexFinderToad = this.potions.indexOf(potionName);
this.potions.splice(indexFinderToad, 1);
// Change code above this line
},
};

Да, все четенько по коду.

Спасибо. Мне приятно.

В реальности мои объяснения не сработают на всех потому что стили мышления с пособы понять мир у людей слишком разнятся и мой стиль не подходит для подавляющего большинства людей. Тебе по-своему повезло попасть сюда и получить объяснения в понятном для себя формате. Давай сразу на “ты”, это интернет, тут все свои.

Принято. Спасибо!