从fs目录遍历动态嵌套结果到对象

时间:2019-01-29 23:32:04

标签: javascript node.js fs

读取文件目录中的一堆翻译文件并将数据分配给全局对象,以便我可以使用i18nContent.messages.en.9999提取翻译

文件树是这样的

locales
    messages
        en.json => {"9999": "Unexpected Error", "0": "Success"}
        de.json => {"9999": "German Error", "0": "German Success"}
    emails
       en.json => {"signupEmail": "Thanks for signing up", "passwordEmail": "Password changed"}
       de.json => {"signupEmail": "German signing up", "passwordEmail": "German Password changed"}

我能够获得每个嵌套对象的所有“名称”。但是,我无法在目录遍历期间组装总对象。

尝试1

global.i18nContent = {};

walkDir(dir, function (filePath, dir) {
  if (filePath.substr(-5) === ".json") {
    let directory = dir.split(/[\s\/]+/);
    directory = directory[directory.length - 1];

    let lang = filePath.split(/[\s\/]+/);
    lang = lang[lang.length - 1].substr(-7, 2);

    //this substr fix is to make this work on Macs
    let rem = __dirname.toString().substr(0, __dirname.toString().length - 3);

    let langFolder = {};
    langFolder[lang] = require(filePath.replace(rem, '../'));

    Object.assign(i18nContent[directory], langFolder);
  }
});

ATTEMPT 2

已删除

let langFolder = {};
langFolder[lang] = require(filePath.replace(rem, '../'));

Object.assign(i18nContent[directory], langFolder);

并尝试了i18nContent[directory][lang] = require(filePath.replace(rem, '../'))i18nContent[directory[lang]] = require(filePath.replace(rem, '../'))

控制台输出显示['undefined']

应嵌套引用为i18nContent.messages.en.9999

1 个答案:

答案 0 :(得分:0)

我假设您正在使用walkdir,对吗?然后我会像这样:

global.i18nContent = {};
const emitter = walkDir(yourDir);

emitter.on('file', filename => {
  const parts = filename.match(/^.*\/locales\/(\w*)\/(\w*)\.json$/);

  if (!parts) return;
  const [, folderName, lang] = parts;

  if (!global.i18nContent[folderName]) global.i18nContent[folderName] = {};
  global.i18nContent[folderName][lang] = require(filename);
});