utils/findNodesRecursively.js

import { get } from 'lodash';

/**
 * Finds nodes and its child nodes recursively based on a given discriminator function
 *
 * @param {Array.<object>} nodes JS objects to search recursively through
 * @param {function} discriminatorFunction Function to determine if the node should be returned in the found list
 *
 * @returns {Array.<object>} The nodes matching the search criteria
 */
function findNodesRecursively(nodes, discriminatorFunction) {
	let foundNodes = [];

	nodes.forEach((node) => {
		if (discriminatorFunction(node)) {
			foundNodes.push(node);
		}

		const childNodes = get(node, 'elements', []);
		foundNodes = foundNodes.concat(
			findNodesRecursively(childNodes, discriminatorFunction),
		);
	});

	return foundNodes;
}

export default findNodesRecursively;