Попрактикуемся ещё с одним вариантом агрегации данных на файловых системах. Напишем функцию, которая принимает на вход директорию и возвращает список директорий первого уровня вложенности и количество файлов в них включая все поддиректории. Эта функция затем может использоваться в утилите командной строки выполняющей соответствующую задачу.

Как видно из постановки, задачу нельзя решить используя reduce в чистом виде, так как нам не нужен обход всех нод, с другой стороны для подсчёта количества файлов обход нужен. Следовательно наша задача распадается уже на две подзадачи: извлечение детей-директорий текущего корня и вызов подсчёта файлов внутри каждого ребёнка.

Начнём с подсчёта количества файлов. Эта задача содержит один примитивный reduce:

import { reduce } from 'hexlet-immutable-fs-trees';

const calculateFilesCount = tree =>
  reduce((acc, node) => (node.type === 'file' ? acc + 1 : acc), tree, 0);

Совершенно типичный reduce который увеличивает аккумулятор на единицу, если тип ноды file. Следующий шаг заключается в том чтобы извлечь всех детей из исходного узла и к каждому из них применить подсчёт.

import { mkdir, mkfile } from 'hexlet-immutable-fs-trees';

const tree = mkdir('/', [
  mkdir('etc', [
    mkdir('apache'),
    mkdir('nginx', [
      mkfile('nginx.conf'),
    ]),
  ]),
  mkdir('consul', [
    mkfile('config.json'),
    mkfile('file.tmp'),
    mkdir('data'),
  ]),
  mkfile('hosts'),
  mkfile('resolve'),
]);

const result = tree.children
  .filter(n => n.type === 'directory')
  .map(n => [n.name, calculateFilesCount(n)]);

console.log(result);
// => [['etc', 1], ['consul', 2]]

То есть мы обратились к детям напрямую сначала отфильтровав их, а затем и выполнив отображение на необходимый массив, содержащий для каждой директории имя и количество файлов в нем.

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →