迭代 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