递归读取目录并在NodeJS中创建对象

时间:2019-02-13 17:44:39

标签: javascript node.js object

我一直在努力尝试自动化和清理如何使用NodeJS socket.io服务器在HTML5游戏中利用Sprite生成和加载来发送包含生成Sprite所需数据的对象。

我要实现的目标是通读目录/img及其所有子目录(/assets1/assets2/assets3等)并创建一个对象基于它们的数据和结构。我遇到的问题是我找不到一种处理/assets3子目录的好方法。以下是我的资产设置示例:

Directory structure

这是我想要实现的目标示例,但并非仅仅使用无穷无尽的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
      }
    });
  });

1 个答案:

答案 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;
  }, {});
}