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".

что подкажете?
  • Вопрос задан
  • 1211 просмотров
Решения вопроса 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 с регулярками.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
22 нояб. 2024, в 19:51
15000 руб./за проект
22 нояб. 2024, в 19:15
200000 руб./за проект
22 нояб. 2024, в 18:50
30000 руб./за проект