solotony
@solotony
покоряю пик Балмера

Как посчитать количество функций в коде JS?

Столкнулся с тестовым заданием (знакомому прислал рекрутер), которое поставило меня в тупик.

Выполните задание на языке JavaScript или на любом другом языке программирования.

Программа должна получать на вход *.js-файл (пример файла
https://github.com/SAP-samples/s4hana-ext-deploy-c...)

2a. Обработать входной файл и вывести на экран наименования функций, у которых есть оператор return. Не учитывать вложенные функции (определенные внутри тела функции в качестве переменных или callback-функций).

2b. Обработать входной файл и вывести на экран наименования только тех функций, у которых есть входные параметры, с указанием их количества. Не учитывать вложенные функции (определенные внутри тела функции в качестве переменных или callback-функций).

Пример вывода для функции _deleteOneEntity: function (sPath, fnSuccess, fnFailed) :

_deleteOneEntity : 3



я представляю как это сделать, написав парсер JS при помощи Lex-Yacc, но вряд-ли такое дали на тест, учитывая что два других вопроса это "посчитать количество нулей в факториале" и "написать запрос к API".

что подкажете?
  • Вопрос задан
  • 1196 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Такие задачи однозначно решаются обходом AST. Возьмите общеизвестный парсер и инструмент для обхода его дерева, например связка из @babel/parser и @babel/traverse подойдет.
Так же можно посмотреть в какие ноды что парсится с помощью https://astexplorer.net/ - в нем несколько языков, а для js/ts на выбор есть несколько парсеров.
Вам по сути нужно найти FunctionDeclaration содержащий в body ReturnStatement и извлечь из него Identifier соответствующий имени. А для второй части - FunctionDeclaration с ArgumentsList не нулевой длины.
Ну и так как в условии сказано, что внутрь не заходить, то можно пройтись лишь по верхнему уровню, тогда @babel/traverse и не нужен даже
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
можно даже потоково это посчитать.

заводишь три флага:
1. мы внутри функции
2. внутри строки
3. внутри вложенной функции

читаешь посимвольно пока не наткнешься на function или => объявление переменной, если попал в функцию запоминаешь имя (можно еще номер строки и символа), перебираешь дальше в поисках return или конца конца функции.

если попал внутрь вложенной функции - ищешь ее конец, return и другие вложенные игнорируешь.
если попал внутрь строки - ищешь конец строки, в строке игнорируешь вообще все.

А когда у тебя есть файл, все проще) есть indexOf, slice, replace с регулярками.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 11:14
65000 руб./за проект
19 апр. 2024, в 11:08
5000 руб./за проект
19 апр. 2024, в 10:59
150000 руб./за проект