Как показывают комментарии, нет особых причин делать это рекурсивно. indexOf
хорошо решает эту проблему.
Но, если вы решили написать рекурсивное решение, у вашей техники огромная проблема. Вы уничтожаете объект, который пытаетесь найти!
Array.prototype.splice
является разрушительным . Изменяет массив, на котором работает. В итоге у вас будет индекс и почти пустая колода карт!
То, что это работает вообще, почти совпадение. Если бы вы хотели использовать slice
, это бы сработало и не вызывало этой проблемы. slice
просто дает вам копию массива, начиная с одного индекса и заканчивая другим (или в конце массива). splice
делает больше. Он удаляет подсписок элемента, вставляет дополнительные и возвращает удаленные. Если вы вызываете его только с начальным индексом, он удаляет остальную часть массива и возвращает его. Так что вызовы deck.slice(1)
и deck.splice(1)
возвращают одно и то же, но второй также удаляет все возвращенные элементы из вашего массива.
Так что самое быстрое исправление вашей функции это просто:
const getCardIndex = (deck, fullCardName) =>
fullCardName === deck[0]
? 52 - deck.length
: getCardIndex (deck.slice(1), fullCardName)
Но это не имеет особого смысла, если честно. Это работает, но при каждом рекурсивном вызове он создает новый массив, который короче предыдущей версии. Это просто память для простого поиска.
Итак, вот еще один метод, который используется только для индекса:
const getCardIndex = (deck, fullCardName, idx = 0) =>
idx >= deck.length
? -1
: deck [idx] == fullCardName
? idx
: getCardIndex (deck, fullCardName, idx + 1)
Обратите внимание, однако, что в этом параметре c нет ничего колоды и карты, кроме имен переменных и функций. Таким образом, мы могли бы преобразовать это в более общую c функцию, например:
const getIndex = (xs, x, idx = 0) =>
idx >= xs.length
? -1
: xs [idx] == x
? idx
: getIndex (xs, x, idx + 1)
И там у нас есть рекурсивное решение для нахождения индекса значения в произвольном массиве.
Опять же, однако, есть очень мало причин использовать эту функцию. Это разумное упражнение для изучения рекурсии, но не более того. Вместо этого используйте indexOf
.