地图对象在执行函数后不设置值
Map object not setting values after execution of function
我在下面有一个函数,目的是解析多个本地 csv 文件。对于每个解析的 csv 文件,我然后抓取 1-5 个随机元素。由于 CSV 解析器以嵌套数组结构 ([['a'], ['b'], ['c']]
) 输出数据,我进一步处理数据并提取单个数组元素以推入 final
数组。
我的最终目标是通过传入每个键的相应数组来更新 types
映射中的值
let health = createHealthData();
console.log(health, 'final output')
function createHealthData() {
let types = new Map();
types.set('allergies', '');
types.set('medications', '')
let start = 1;
let limit = 5;
for (let key of types.keys()) {
let randNum = Math.floor(Math.random() * (limit - start + 1) + start); // Generates random numbers between start and limit
let file = fs.createReadStream(path.resolve(__dirname, `${key}.csv`))
Papa.parse(file, {
header: false,
complete: (results) => {
let first = []
let data = results.data;
let final = [];
for (let i = 1; i <= randNum; i++) {
first.push(data[Math.floor(Math.random() * data.length)])
}
first.forEach((x) => {
x.forEach((y) => {
final.push(y)
})
})
types.set(key, final);
console.log(types);
}
})
}
return types;
}
我的函数可以很好地解析和处理 csv 文件,但是一旦我 return types
地图
它拒绝更新地图中的现有键
例如,我在 console.log(types)
的输出为我:
Map(2) {
allergies => ['Banana Allergy'],
medications => ['Opana ER', 'Atrovent HFA']
}
这就是我打算传递给函数的内容。
然而,函数执行完毕后查看health
变量,输出为:
Map(2) {'allergies' => '', 'medications' => ''} final output
就好像 types.set(key,final)
行从未在函数末尾执行过。我正在努力寻找这个错误的来源,并且根据函数中 types
变量的范围,我没有看到它可能被覆盖的地方。
看起来 Papa.parse 是异步的:
https://www.papaparse.com/docs
"Doesn't return anything. Results are provided asynchronously to a
callback function."
由于你在最后 return types
,由于执行的异步性质(即 return 类型首先发生,然后是解析完成回调,你将无法获得正确的值).
有一个类似的问题描述了不同的处理方式 Papa.parse:How to use Promises with PapaParse?
据我了解 return 函数无需等待 Papa.parse 回调,因此请尝试 How to use Promises with PapaParse? 的解决方案以等待完整的回调完成,然后 return 类型
我在下面有一个函数,目的是解析多个本地 csv 文件。对于每个解析的 csv 文件,我然后抓取 1-5 个随机元素。由于 CSV 解析器以嵌套数组结构 ([['a'], ['b'], ['c']]
) 输出数据,我进一步处理数据并提取单个数组元素以推入 final
数组。
我的最终目标是通过传入每个键的相应数组来更新 types
映射中的值
let health = createHealthData();
console.log(health, 'final output')
function createHealthData() {
let types = new Map();
types.set('allergies', '');
types.set('medications', '')
let start = 1;
let limit = 5;
for (let key of types.keys()) {
let randNum = Math.floor(Math.random() * (limit - start + 1) + start); // Generates random numbers between start and limit
let file = fs.createReadStream(path.resolve(__dirname, `${key}.csv`))
Papa.parse(file, {
header: false,
complete: (results) => {
let first = []
let data = results.data;
let final = [];
for (let i = 1; i <= randNum; i++) {
first.push(data[Math.floor(Math.random() * data.length)])
}
first.forEach((x) => {
x.forEach((y) => {
final.push(y)
})
})
types.set(key, final);
console.log(types);
}
})
}
return types;
}
我的函数可以很好地解析和处理 csv 文件,但是一旦我 return types
地图
例如,我在 console.log(types)
的输出为我:
Map(2) {
allergies => ['Banana Allergy'],
medications => ['Opana ER', 'Atrovent HFA']
}
这就是我打算传递给函数的内容。
然而,函数执行完毕后查看health
变量,输出为:
Map(2) {'allergies' => '', 'medications' => ''} final output
就好像 types.set(key,final)
行从未在函数末尾执行过。我正在努力寻找这个错误的来源,并且根据函数中 types
变量的范围,我没有看到它可能被覆盖的地方。
看起来 Papa.parse 是异步的: https://www.papaparse.com/docs
"Doesn't return anything. Results are provided asynchronously to a callback function."
由于你在最后 return types
,由于执行的异步性质(即 return 类型首先发生,然后是解析完成回调,你将无法获得正确的值).
有一个类似的问题描述了不同的处理方式 Papa.parse:How to use Promises with PapaParse?
据我了解 return 函数无需等待 Papa.parse 回调,因此请尝试 How to use Promises with PapaParse? 的解决方案以等待完整的回调完成,然后 return 类型