Закрытие заданного набора FDs является множеством всех FD, которые должны выполняться, когда те, которые находятся в данном наборе, сохраняются. Т. Е. Множество всех ФД, выводимых из одного в данном множестве некоторой последовательностью аксиом Армстронга. Вам будет сказано, что у каждого набора есть такое закрытие, и оно уникально. И мы можем найти замыкание, неоднократно применяя некоторую аксиому каким-то новым способом, используя заданные и / или полученные до сих пор FD, до тех пор, пока не будут получены новые FD.
Вы нашли один FD, подразумеваемый исходным множеством {A -> DC, D -> B}, а именно A -> BC, применяя одно правило к некоторым FD в наборе. Если вы не смогли получить новый, применив любые другие правила, то замыканием будет множество {A -> DC, D -> B, A -> BC}. Но это не закрытие, потому что вы все равно можете генерировать хотя бы еще один FD, а именно A-> BDC. И тогда есть A -> A. Продолжайте пытаться применить. Закрытие будет множеством всех FD, которые вы можете получить.
Функциональные зависимости Google armstrong's axioms для многих академических объяснений. Например этот .
Или без внешней зависимости:
/**
Walk directory,
list tree without regex excludes
*/
var fs = require('fs');
var path = require('path');
var walk = function (dir, regExcludes, done) {
var results = [];
fs.readdir(dir, function (err, list) {
if (err) return done(err);
var pending = list.length;
if (!pending) return done(null, results);
list.forEach(function (file) {
file = path.join(dir, file);
var excluded = false;
var len = regExcludes.length;
var i = 0;
for (; i < len; i++) {
if (file.match(regExcludes[i])) {
excluded = true;
}
}
// Add if not in regExcludes
if(excluded === false) {
results.push(file);
// Check if its a folder
fs.stat(file, function (err, stat) {
if (stat && stat.isDirectory()) {
// If it is, walk again
walk(file, regExcludes, function (err, res) {
results = results.concat(res);
if (!--pending) { done(null, results); }
});
} else {
if (!--pending) { done(null, results); }
}
});
} else {
if (!--pending) { done(null, results); }
}
});
});
};
var regExcludes = [/index\.html/, /js\/lib\.js/, /node_modules/];
walk('.', regExcludes, function(err, results) {
if (err) {
throw err;
}
console.log(results);
});
Полагаю, это больше не актуально, но я застрял с тем же вопросом и нашел ответ.
Это можно сделать, используя только модуль npm glob
. Нам нужно использовать опций в качестве второго параметра функции glob
glob('pattern', {options}, cb)
Для ваших нужд существует шаблон options.ignore
.
var glob = require('glob');
glob("**/*",{"ignore":['index.html', 'js', 'js/app.js', 'js/lib.js']}, function (err, files) {
console.log(files);
})
Ознакомьтесь с globby
, что довольно много glob
с поддержкой нескольких шаблонов и API Promise:
const globby = require('globby');
globby(['**/*', '!index.html', '!js/lib.js']).then(paths => {
console.log(paths);
});
Вот что я написал для своего проекта:
var glob = require('glob');
var minimatch = require("minimatch");
function globArray(patterns, options) {
var i, list = [];
if (!Array.isArray(patterns)) {
patterns = [patterns];
}
patterns.forEach(function (pattern) {
if (pattern[0] === "!") {
i = list.length-1;
while( i > -1) {
if (!minimatch(list[i], pattern)) {
list.splice(i,1);
}
i--;
}
}
else {
var newList = glob.sync(pattern, options);
newList.forEach(function(item){
if (list.indexOf(item)===-1) {
list.push(item);
}
});
}
});
return list;
}
И назовите это так (Используя массив):
var paths = globArray(["**/*.css","**/*.js","!**/one.js"], {cwd: srcPath});
или вот это (Используя одну строку):
var paths = globArray("**/*.js", {cwd: srcPath});
Пример с глотком:
gulp.task('task_scripts', function(done){
glob("./assets/**/*.js", function (er, files) {
gulp.src(files)
.pipe(gulp.dest('./public/js/'))
.on('end', done);
});
});
Вы можете использовать ноду-глобулу для этого:
var globule = require('globule');
var result = globule.find(['**/*', '!index.html', '!js/lib.js']);
console.log(result);