阅读node.js中的JSON文件时,fs.readFileSync给出重复的结果

monwx1rj  于 2023-01-06  发布在  Node.js
关注(0)|答案(1)|浏览(129)

我有两个JSON文件要处理:

  • sorted/apr-total2.json
  • sorted/may-total2.json

还有其他月份的文件,但出于调试的目的,我将重点放在这两个月,因为它们导致了问题。
它们包含以下格式的简单数据:

[
["John", 1403],
["Peter", 1159],
...
]

但是,John仅在sorted/apr-total2.json文件中可用,而在sorted/may-total2.json文件中不可用。
我的代码如下:

let months = ["apr", "may"];
let dataToSort = {};

function getDataFromJSONFile(month) {
  let jsonData = fs.readFileSync(`sorted/${month}-total2.json`);
  let convertedData = JSON.parse(jsonData);
  return convertedData;
}

function arrayToObject(data) {
  data.forEach((user) => {
    dataToSort[user[0].toString()] = user[1];
  });
  return dataToSort;
}

for (let i in months) {
  let currentMonth = months[i];
  console.log("Current month is " + currentMonth);
  let getDataForMonth = getDataFromJSONFile(currentMonth);
  let convertedMonth = arrayToObject(getDataForMonth);
  if (convertedMonth.hasOwnProperty("John") == true) {
    console.log(true);
  }
}

我的输出如下:

Current month is apr
true
Current month is may
true

这是不正确的,因为用户John在 * sorted/may-total2. json * 中不可用。那么为什么会发生这种情况呢?似乎是对象convertedMonth导致了这个问题。
如果我在for循环末尾添加以下代码,并删除 * ConvertedMonth * 对象属性:

for (let item in convertedMonth) {
  delete convertedMonth[item];
}

它按预期工作:

Current month is apr
true
Current month is may

我想知道为什么这个对象会导致这个问题,因为我在项目的另一个地方重用了相同的代码。

b1zrtrql

b1zrtrql1#

您的arrayToObject函数使用单个全局dataToSort,因此任何条目都将累积并覆盖在其中。请参阅:

> let dataToSort = {};
> function arrayToObject(data) {
...   data.forEach((user) => {
...     dataToSort[user[0].toString()] = user[1];
...   });
...   return dataToSort;
... }
> arrayToObject([["foo", 123]])
{ foo: 123 }
> arrayToObject([["foo", 456], ["bar", 567]])
{ foo: 456, bar: 567 }

你的程序简化为

let months = ["apr", "may"];

for (let currentMonth of months) {
    console.log("Current month is " + currentMonth);
    let jsonData = JSON.parse(fs.readFileSync(`sorted/${month}-total2.json`));
    let convertedMonth = Object.fromEntries(jsonData);
    if (convertedMonth["John"]) {
        console.log(true);
    }
}

其中

  • 使用for..of在几个月内进行正确且更简单的迭代
  • 使用Object.fromEntries将2个数组的数组转换为普通对象(这就是arrayToObject所做的)

相关问题