gpt4 book ai didi

javascript - 使用 require-all 从目录和子目录递归加载文件

转载 作者:行者123 更新时间:2023-11-30 13:57:24 25 4
gpt4 key购买 nike

我在一个目录和子目录中有 json 文件,我想将它们与特定条件匹配,但是我不知道如何使用这些子目录。

我正在使用 require-all查找 json 文件:

const reqAll = require('require-all')({
dirname: __dirname + '/resource',
filter: /(.+)\.json$/,
recursive: true
});

我的文件树是这样的:

MyDir
- file1.json
- SubDir
-- file2.json

打印reqAll 将输出:

{ 
file1: {
path: /first,
body: ...some body
},
SubDir: {
file2: {
path: /second,
body: ...some body
}
}
}

我最初使用以下过滤器来清除我的数据,因为我最初没有使用子目录,但现在这样做很有意义。

let source = Object.values(reqAll).filter(r => {
return r.path === req.url;
}

其中 req.url 是我发送的 http 请求的 url。即:localhost:8080/first,以便与 匹配>file1 文件在我的目录中。

问题是,当我提交 localhost:8080/second 时,我没有得到响应,因为我无法匹配到 file2,因为它在子目录中。发送 localhost:8080/SubDir/file2 也不起作用。

有什么方法可以让它发挥作用吗?

最佳答案

在您写的评论中:

So, I will perform a HTTP GET on, localhost:8080/first and it should return me the body of the file1 object. This does in fact work for this endpoint. However, it is when I perform a HTTP GET on localhost:8080/second that I cannot get the body back.

为此,您需要递归搜索具有该 path 的条目,大致如下(请参阅评论):

const repAll = { 
file1: {
path: "/first"
},
SubDir: {
file2: {
path: "/second"
},
SubSubDir: {
file3: {
path: "/third"
}
}
}
};
const req = {};

function findEntry(data, path) {
for (const value of Object.values(data)) {
// Is this a leaf node or a container?
if (value.path) {
// Leaf, return it if it's a match
if (value.path === path) {
return value;
}
} else {
// Container, look inside it recursively
const entry = findEntry(value, path);
if (entry) {
return entry;
}
}
}
return undefined; // Just to be explicit
}

for (const url of ["/first", "/second", "/third", "fourth"]) {
req.url = url;
console.log(req.url + ":", findEntry(repAll, req.url));
}
.as-console-wrapper {
max-height: 100% !important;
}

我添加了第二个子目录以确保递归继续工作,并添加了一个示例,说明如果您没有找到匹配的路径,您会返回什么。

当然,您可以通过预先处理一次 repAll 来构建 map ,然后重新使用该 map ,这会比这种线性搜索更快:

const repAll = { 
file1: {
path: "/first"
},
SubDir: {
file2: {
path: "/second"
},
SubSubDir: {
file3: {
path: "/third"
}
}
}
};

const byPath = new Map();
function indexEntries(map, data) {
for (const value of Object.values(data)) {
if (value) {
// Leaf or container?
if (value.path) {
map.set(value.path, value);
} else {
indexEntries(map, value);
}
}
}
}
indexEntries(byPath, repAll);

const req = {};
for (const url of ["/first", "/second", "/third", "fourth"]) {
req.url = url;
console.log(req.url + ":", byPath.get(req.url));
}
.as-console-wrapper {
max-height: 100% !important;
}

关于javascript - 使用 require-all 从目录和子目录递归加载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56985934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com