我一直在努力尝试自动化和清理如何使用NodeJS socket.io服务器在HTML5游戏中利用Sprite生成和加载来发送包含生成Sprite所需数据的对象。
我要实现的目标是通读目录/img
及其所有子目录(/assets1
,/assets2
,/assets3
等)并创建一个对象基于它们的数据和结构。我遇到的问题是我找不到一种处理/assets3
子目录的好方法。以下是我的资产设置示例:
这是我想要实现的目标示例,但并非仅仅使用无穷无尽的if
/ else
s,这些对我来说似乎并不吸引人,因此必须有一个更好的选择使用库的方式。
var outputWeWant = {
assets1: {
img1: '/img/assets1/img1.png',
img2: '/img/assets1/img2.png',
},
assets2: {
img1: '/img/assets2/img1.png',
img2: '/img/assets2/img2.png',
},
assets3: {
img1: '/img/assets3/img1.png',
img2: '/img/assets3/img2.png',
assets4: {
img1: '/img/assets3/assets4/img1.png'
}
}
}
下面只是我进行的一些脑力激荡,但这并不像我想的那样有效,并且在将新目录添加到资产4时对目录进行检查似乎令人作呕
fs.readdirSync('/img/').map(dirName => {
fs.readdirSync('/img/' + dirName).map(fileName => {
if (fs.statSync('/img/' + dirName + '/' + fileName).isDirectory()) {
// Read the new directory and add the files to our object
} else {
// It's not a directory, just add it to our object
}
});
});
答案 0 :(得分:0)
这种可能无限的操作需要recursive function。我将假定要为Node编写此功能,并将文件系统详细信息留给OP。 此代码段应被视为伪代码。
$message = htmlspecialchars(nl2br($_POST['message'], false)) ;
$request_body_json = '{
"from": {
"email": "***",
"name": "'.$fromname.'"
},
"reply_to": {
"email": "'.$fromemail.'",
"name": "'.$fromname.'"
},
"content": [
{
"type": "text/html",
"value": "'.$message.'"
}
],
"categories": [
"IT email"
],
"mail_settings": {
"bcc": {
"email": "***",
"enable": true
},
"bypass_list_management": {
"enable": false
},
"sandbox_mode": {
"enable": false
}
},
"personalizations": [
{
"to":
'.$to_email_object.',
"subject": "'.$subject.'"
}
],
"tracking_settings": {
"click_tracking": {
"enable": true,
"enable_text": true
},
"open_tracking": {
"enable": true,
"substitution_tag": "%opentrack"
}
}
}';
$request_body = json_decode($request_body_json) ;
try {
$response = $sg->client->mail()->send()->post($request_body);
...
}
在OP中添加了function parseDirectory(directory) {
return directory.getItems().reduce((out, item) => {
switch (item.type) {
case 'file':
out[item.name] = item.path;
break;
case 'directory':
out[item.name] = parseDirectory(item.path);
break;
}
return out;
}, {});
}
代码,这是一个(理论上)有效的功能:
fs
如果reduce()
的语法太虚构,您可以尝试以下方法:
function parseDirectory(directory) {
return fs.readdirSync(directory).reduce((out, item) => {
const itemPath = `${directory}/${item}`;
if (fs.statSync(itemPath).isDirectory()) {
out[item] = parseDirectory(itemPath);
} else {
out[item] = itemPath;
}
return out;
}, {});
}