Глубокое значение фильтра с использованием принципов функционального программирования


deepFilter функция использует predicate чтобы отфильтровать свойства, которые могут быть вложенными глубоко в данный value (объект или массив). Он возвращает отфильтрованный объект или массив.

Код работает для большинства входов (произвольного уровня вложенности и вход без циклических ссылок). Меня больше интересуют комментарии на мой подход к ФП, чем правильность кода. Хотя я бы не возражал, если бы вы указать ошибку.

const and = (f1, f2) => v => f1(v) && f2(v);

const or = (f1, f2) => v => f1(v) || f2(v);

const isArray = v => Array.isArray(v);

const isObject = v => typeof v === 'object' && v !== null;

const hasProps = v => Object.keys(v).length > 0;

const selector = (predicate, v1, v2) => v => (predicate(v) ? v1 : v2);

const isObjectOrArray = or(isArray, isObject);

const hasValue = and(isObjectOrArray, hasProps);

const initial = selector(isArray, [], {});

function deepFilter(value, predicate) {
  if (isObjectOrArray(value)) {
    return Object.keys(value).reduce((filtered, key) => {
      if (predicate(key)) {
        return { ...filtered, [key]: value[key] };
      }
      const v = deepFilter(value[key], predicate);
      return hasValue(v) ? { ...filtered, [key]: v } : filtered;
    }, initial(value));
  }
  return value;
}


Комментарии