Я знаю, что рекурсии не так много реальных примеров. Кажется, я нашел один сегодня, и я хочу поделиться им. Q & Стиль, потому что я думаю, что это захватывающе.Поиск последнего элемента многомерного массива, который удовлетворяет условию с помощью рекурсии
Я использую двигатель Phaser для игры в шахте. После щелчка пользователя мне нужно найти элемент игры, на который пользователь щелкнул. Это усложняется, когда есть несколько элементов один поверх другого. Затем мне нужно будет проверить их порядок рендеринга и выбрать элемент с наивысшим.
В Phaser корень всех отображаемых объектов является «миром». Все существующие элементы являются либо прямыми детьми мира, либо детьми детей. Это ветвящаяся структура с игровым миром сверху. Дети упорядочиваются по порядку их рендеринга, что означает, что последний находится сверху.
Вот пример этого, имея каждый объект отображения, представленный рядом:
var world = [
[
18,
3,
[
1,
14,
2
],
5,
9,
[
3,
5
]
],
[
16,
7
]
];
Существует три уровня в этом массиве с двумя основными «группами». В игровых терминах вторая группа добавляется после первого, поэтому она отображается сверху. Внутри первой группы последний элемент отображается сверху, который является группой. Внутри этой группы последний элемент отображается сверху и так далее. Из всех этих элементов тот, который отображается на самом верху, 7
, так как он последний.
Предположим, что я нажимаю на мышь, и это оказывается поверх всех элементов, представленных большим числом, чем 10 (18
, 14
и 16
). Тот, который мне нужен, это 16
, так как он самый далекий.
Как это получить?
О первом фрагменте - что является преимуществом использования 'Array.forEach()'? Если я его использую, мне также нужно проверить, является ли текущий объект массивом, чтобы избежать вызова его на число. С циклом for, если я попытаюсь перебрать число, его длина будет неопределенной, и цикл не будет выполнен. Я полагаю, что это может быть проблематично, если присутствует 'length', но на самом деле это не массив. О втором фрагменте - можете ли вы немного объяснить, как это работает? Я никогда не видел 'reduce()' раньше, и я изо всех сил пытаюсь выяснить, что происходит. Мне нравится код. –
вы можете добавить проверки здравомыслия перед вызовом функции или вернуть, если не указан правильный тип. 'reduce' выполняет итерацию массива, принимает обратный вызов и как опцию начальное значение. то он возвращает новую базу значений для данного или последнего значения и фактического значения. в этом случае обратный вызов выполняет функцию сравнения 'largeThan10' и возвращает функцию' iter' в качестве обратного вызова для возврата. внутри функции он проверяет массив и возвращает либо значение уменьшения, либо проверенное значение. Еще одна причина для сокращения, вы могли бы написать классное предложение, подобное выражению. –
на вопрос, почему 'forEach', это просто внешний подход с внешней переменной для сохранения результата. –