Алгоритм рекурсивного сглаживания набора массивов - PullRequest
0 голосов
/ 18 мая 2019

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

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

Единственная проблема в том, что я имею представление о том, как описать, что делает эта функция, в терминах имени функции многократного использования, которое я могу хранить где-то между общими помощниками-редукторами.

Есть ли имя для алгоритма, выполняемого рекурсивным редукцией?

const logLevel = process.env.LOG_LEVEL;

const levels = {
    info: 'info',
    debug: 'debug',
    warning: 'warning',
    error: 'error'
}

const includes = {
    [levels.debug]: [levels.info],
    [levels.info]: [levels.warning],
    [levels.warning]: [levels.error]
}

const format = {
    simple: (strings, ...values) => strings.reduce ((l, r, i) => [l,JSON.stringify (vals[i]),r].join (''))
}

const uniqueRefSlow  = (ele, ind, arr) => !~arr.indexOf (ele, ind + 1);

const Combine = lists => function concatTreeRecursive (levels, level) {
    let more = lists[level]||[];
    if (more.length) return more.reduce (concatTreeRecursive, [level, ...levels])
	  return [level, ...levels].filter (uniqueRefSlow);
};

const reduceRecursive = Combine (includes); 
const combineLevels = levels => levels.reduce (reduceRecursive);
// ^  How is this operation called?
console.log (`Logging on level ${logLevel}`);

const Log = (levels = [LEVELS.info], tag = format.simple) => (strings, ...values) => {
    let message = tag (strings, ...values);
    if (!!~combineLevels (levels).indexOf (logLevel)) {
        console.log (message);
    }
    return message;
}

const debug = Log ([levels.debug])
const info  = Log ([levels.info]);
const warning = Log ([levels.info]);

debug`debug - filtered`
info`info`
warning`warning - included`
<script>const process = {env: {LOG_LEVEL: 'info'}}</script>

1 Ответ

1 голос
/ 18 мая 2019

Попробуйте Array.flatMap () , надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...