迭代 papa.parse 对象的结果
Iterating over results of papa.parse object
我认为这可能是异步或承诺的问题,但是,这个概念一直让我难以理解。我花了很多时间研究与 papaparse 和 promises 相关的问题,但相信我仍然没有掌握一些简单的概念。
概览
在下面的代码中,从用户那里收集了一个 .csv
文件,使用 PapaParse 将其转换为对象,然后将 distance/duration 值添加到来自 GoogleMaps 距离矩阵的数据中,最后,目的是 return 将此数据作为包含此组合信息的 .csv
返回给用户。
在 downloadCSV()
中,我能够记录从 getDistTime
产生的对象。但是,我无法迭代此对象或将其发送到 papa.unparse 以转换为 .csv
。在代码下方,我在 downloadCSV()
.
中附上了 arr
结构的图像
我在这里和 papaparse repo 上花了很多时间研究问题。我将不胜感激任何有关如何最好地进行的帮助。
arr
的内容:
代码
$("#submit").click(function(){
//REMOVE THIS LINE BEFORE LIVE OR VALIDATION WILL BE DUN GOOFED
event.preventDefault();
getData();
});
function getData(){
var csv = document.getElementById('exampleFormControlFile1').files[0];
// Parse CSV string
Papa.parse(csv, {
header: true,
complete: function(results) {
var final_rows = getDistTime(results)
downloadCSV(final_rows)
}
});
} // end getData
function downloadCSV(arr){
//console.log(arr) shows the results
// but trying to iterate over arr or unparsing shows undefined
console.log(arr)
csv = Papa.unparse(arr)
...more csv export code
}
function getDistTime(resources){
var rows = []
const promiseArr = [];
for (var i = 0; i < resources.data.length; i++) {
var origin1 = $("#citystate").val();;
var destinationA = resources.data[i]['DEMOBILIZATION CITY'] + ',' + resources.data[i]['DEMOBILIZATION STATE'];
promiseArr.push(googleRequest(origin1, destinationA));
}
Promise.all(promiseArr)
.then((resultsArr) => {
resultsArr.forEach((result, i) =>
pushToRows(resources.data[i], result, rows));
})
return rows
} // end getDistTime
function pushToRows(resources, dist_dur, rows){
resources["DISTANCE_MI"] = dist_dur[0];
resources["ACTUAL_DUR_HR"] = dist_dur[1];
resources["FINANCE_DUR_HR"] = (dist_dur[0] / 45.0).toFixed(2)
rows.push(resources)
} // end pushToRows
getDistTime 正在执行异步操作,因此在 Promise.all 解决之前行是 returning 空的,因为在承诺解决之前您不会向它推送任何数据。
看起来您需要等待 getDistTime 的结果或更改获取数据的工作方式,不确定您使用的是异步等待,所以最简单的方法就是 return Promise.all 和然后仅在 return 编辑并在您的完整回调中解决后才下载 csv。
例如你可以做
function getData(){
var csv = document.getElementById('exampleFormControlFile1').files[0];
// Parse CSV string
Papa.parse(csv, {
header: true,
complete: function(results) {
getDistTime(results).then(finalRows => downloadCSV(finalRows));
}
});
} // end getData
function getDistTime(resources){
var rows = []
const promiseArr = [];
for (var i = 0; i < resources.data.length; i++) {
var origin1 = $("#citystate").val();;
var destinationA = resources.data[i]['DEMOBILIZATION CITY'] + ',' + resources.data[i]['DEMOBILIZATION STATE'];
promiseArr.push(googleRequest(origin1, destinationA));
}
return Promise.all(promiseArr)
.then((resultsArr) => {
resultsArr.forEach((result, i) =>
pushToRows(resources.data[i], result, rows)
);
return rows
})
} // end getDistTime
我认为这可能是异步或承诺的问题,但是,这个概念一直让我难以理解。我花了很多时间研究与 papaparse 和 promises 相关的问题,但相信我仍然没有掌握一些简单的概念。
概览
在下面的代码中,从用户那里收集了一个 .csv
文件,使用 PapaParse 将其转换为对象,然后将 distance/duration 值添加到来自 GoogleMaps 距离矩阵的数据中,最后,目的是 return 将此数据作为包含此组合信息的 .csv
返回给用户。
在 downloadCSV()
中,我能够记录从 getDistTime
产生的对象。但是,我无法迭代此对象或将其发送到 papa.unparse 以转换为 .csv
。在代码下方,我在 downloadCSV()
.
arr
结构的图像
我在这里和 papaparse repo 上花了很多时间研究问题。我将不胜感激任何有关如何最好地进行的帮助。
arr
的内容:
代码
$("#submit").click(function(){
//REMOVE THIS LINE BEFORE LIVE OR VALIDATION WILL BE DUN GOOFED
event.preventDefault();
getData();
});
function getData(){
var csv = document.getElementById('exampleFormControlFile1').files[0];
// Parse CSV string
Papa.parse(csv, {
header: true,
complete: function(results) {
var final_rows = getDistTime(results)
downloadCSV(final_rows)
}
});
} // end getData
function downloadCSV(arr){
//console.log(arr) shows the results
// but trying to iterate over arr or unparsing shows undefined
console.log(arr)
csv = Papa.unparse(arr)
...more csv export code
}
function getDistTime(resources){
var rows = []
const promiseArr = [];
for (var i = 0; i < resources.data.length; i++) {
var origin1 = $("#citystate").val();;
var destinationA = resources.data[i]['DEMOBILIZATION CITY'] + ',' + resources.data[i]['DEMOBILIZATION STATE'];
promiseArr.push(googleRequest(origin1, destinationA));
}
Promise.all(promiseArr)
.then((resultsArr) => {
resultsArr.forEach((result, i) =>
pushToRows(resources.data[i], result, rows));
})
return rows
} // end getDistTime
function pushToRows(resources, dist_dur, rows){
resources["DISTANCE_MI"] = dist_dur[0];
resources["ACTUAL_DUR_HR"] = dist_dur[1];
resources["FINANCE_DUR_HR"] = (dist_dur[0] / 45.0).toFixed(2)
rows.push(resources)
} // end pushToRows
getDistTime 正在执行异步操作,因此在 Promise.all 解决之前行是 returning 空的,因为在承诺解决之前您不会向它推送任何数据。
看起来您需要等待 getDistTime 的结果或更改获取数据的工作方式,不确定您使用的是异步等待,所以最简单的方法就是 return Promise.all 和然后仅在 return 编辑并在您的完整回调中解决后才下载 csv。
例如你可以做
function getData(){
var csv = document.getElementById('exampleFormControlFile1').files[0];
// Parse CSV string
Papa.parse(csv, {
header: true,
complete: function(results) {
getDistTime(results).then(finalRows => downloadCSV(finalRows));
}
});
} // end getData
function getDistTime(resources){
var rows = []
const promiseArr = [];
for (var i = 0; i < resources.data.length; i++) {
var origin1 = $("#citystate").val();;
var destinationA = resources.data[i]['DEMOBILIZATION CITY'] + ',' + resources.data[i]['DEMOBILIZATION STATE'];
promiseArr.push(googleRequest(origin1, destinationA));
}
return Promise.all(promiseArr)
.then((resultsArr) => {
resultsArr.forEach((result, i) =>
pushToRows(resources.data[i], result, rows)
);
return rows
})
} // end getDistTime