读取所有文件并以对象格式存储在节点 js / javascript

read all the file and store in object format in node js / javascript

我写了一段代码,帮助我读取所有文件夹文件,并让我以数组格式存储它们,所以我的代码看起来像这样

readAll.js

module.exports = readAllFile = () => {
  const arr = [];
  fs.readdir(path.join("./admin/requiredFiles"), (err, fileNames) => {
    if (err) throw console.log(err.message);
    // Loop fileNames array
    fileNames.forEach((filename) => {
      // Read file content
      fs.readFile(
        path.join("./admin/requiredFiles", `./${filename}`),
        (err, data) => {
          if (err) throw console.log(err.message);
          // Log file content
          arr.push(JSON.parse(data));
          fs.writeFileSync(
            path.join("./admin/execuetedFile", `config.json`),
            `${JSON.stringify(arr)}`,
            (err) => {
              if (err) throw console.log(err.message);
            }
          );
        }
      );
    });
  });
};

所以这有助于我读取 admin/requiredFiles 中存在的所有文件,并将这些文件保存在 executedFile

但问题是这有助于我以数组格式存储但我想以对象形式存储数据

假设这是我的几个文件数据

file1.json

{
  "admin":{
    "right":"yes",
    "permission":"available"
  },
  "admin_power":{
    "addUser":"available",
    "deleteUser":"available"
  }
}

file2.json

{
  "directory":{
    "right":"yes",
    "permission":"modified"
  },
  "directory_power":{
    "add_directory":"yes",
    "assign_directory":"yes"
  }
}

这是我的一些示例文件,它帮助我以

格式保存它们

config.json

[
 {
   "admin":{
     "right":"yes",
     "permission":"available"
   },
   "admin_power":{
     "addUser":"available",
     "deleteUser":"available"
   }
 },
 {
   "directory":{
     "right":"yes",
     "permission":"modified"
   },
   "directory_power":{
     "add_directory":"yes",
     "assign_directory":"yes"
   }
 }
]

而且我不想要这种数组形式我希望复制的文件看起来像这样

期待config.json

{
   "admin":{
     "right":"yes",
     "permission":"available"
   },
   "admin_power":{
     "addUser":"available",
     "deleteUser":"available"
   },
   "directory":{
     "right":"yes",
     "permission":"modified"
   },
   "directory_power":{
     "add_directory":"yes",
     "assign_directory":"yes"
   }
 }

我只是想知道我应该做哪些更改才能在配置中以我期望的格式获得输出,json

您可以使用 Object.keys() 而不是 Array.push()。 解决方案是当你读取每个文件数据时,你应该使用 Object.keys 方法然后遍历所有可用的键并将它添加到你的输出对象。

module.exports = readAllFile = () => {
  const output = {};
  fs.readdir(path.join("./admin/requiredFiles"), (err, fileNames) => {
    if (err) throw console.log(err.message);
    // Loop fileNames array
    fileNames.forEach((filename) => {
      // Read file content
      fs.readFile(
        path.join("./admin/requiredFiles", `./${filename}`),
        (err, data) => {
          if (err) throw console.log(err.message);
          // Log file content
          const parsedData = JSON.parse(data);
          for (let key of Object.keys(parsedData) {
           output[key] = parsedData[key];
          } 
        
          fs.writeFileSync(
            path.join("./admin/execuetedFile", `config.json`),
            `${JSON.stringify(output)}`,
            (err) => {
              if (err) throw console.log(err.message);
            }
          );
        }
      );
    });
  });
};

使用一个对象来收集文件中的对象,Object.assign()doc here)将复合解析的数据...

// use an object (probably should rename)
let arr = {};

// rather than push, assign
Object.assign(arr, JSON.parse(data));

同样,最好将 arr 重命名为 result。请记住在 fs.writeFile.

中引用该新变量名称