我有两个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
我想知道为什么这个对象会导致这个问题,因为我在项目的另一个地方重用了相同的代码。
1条答案
按热度按时间b1zrtrql1#
您的
arrayToObject
函数使用单个全局dataToSort
,因此任何条目都将累积并覆盖在其中。请参阅:你的程序简化为
其中
for..of
在几个月内进行正确且更简单的迭代Object.fromEntries
将2个数组的数组转换为普通对象(这就是arrayToObject
所做的)