如何将对象传递给函数并将结果返回给原始函数

时间:2015-02-13 04:25:36

标签: javascript

所以我正在解析一个有地址对象的csv文件。然后我想把这个地址发送到另一个我去过的网站上获取地址的lat / lng。然后我希望该函数返回lat / lng并将其添加为数组中location对象的子对象。

到目前为止,我正在解析CSV并拔出地址对象。我有能够发送地址并获得lat / lng的功能....但我不知道如何优雅地将它们链接在一起。我想我只能做一个巨大的功能,但我想让它变得更干净。

我的事件数组看起来像这样:

 reportType: 'OFFENSE 2.0',                                                    
  reportNumber: '15021912',                                                     
  offense: '3301',                                                              
  description: 'Driving on Right Side of Roadway.',                             
  dateTime: '02/06/2015',                                                       
  location:                                                                     
   { block: '02:03 Greentree Rd & Mansfield Ave',                               
     zone: 'Outside City' },                                                    
  person: { age: 'OSC', sex: 'N/A' } }  

CSV解析代码就在这里。

function makeURL() {
    var date = new Date();
    var today = date.getDay();
    var day = daysOfTheWeek[today];
    link = 'http://apps.pittsburghpa.gov/police/arrest_blotter/arrest_blotter_' + day + '.csv'
    return link
}

var url = makeURL();
function getURL() {
    http.get(url, function(res) {
        if(res.statusCode === 200) {
            res.pipe(parser);
        } else {
            console.error('The address is unavailable. (%d)', res.statusCode);
        }
    })
}
var parser = parse(function(err, data) {
    for(i = 1; i < data.length; i++) {
        var info = data[i]
        if(info[7] === 'OSC') {
            info[7] = 'Outside City Limits'
        }
        if(info[9] === '') {
            info[9] = 'N/A'
        }
        if(info[8] === '') {
            info[8] = 'N/A'
        }
        var incident = {
            reportType: info[0],
            reportNumber: info[1],
            offense: info[2],
            description: info[3],
            dateTime: info[4],
            location: {
                block: info[5] + " " + info[6],
                zone: info[7],
            },
            person: {
                age: info[8],
                sex: info[9]
            }
        }
        var passLoc = info[5];
        passLoc = passLoc.replace('block ','')
        passLoc = passLoc.replace(/ /g,"+")
        console.log(incident);
//         console.log(passLoc);
    }
});

获取Lat / lng的代码在这里:

function getLoc() {
    for(i = 0; i < locy.length; i++) {
        var address = locy[i]
        var url = "http://geodata.alleghenycounty.us/arcgis/rest/services/Geocoders/EAMS_Composite_Loc/GeocodeServer/findAddressCandidates?Street=" + address + "&City=Pittsburgh&State=PA&ZIP=&SingleLine=&outFields=&outSR=4326&searchExtent=&f=pjson";
        http.get(url, function(res) {
            var data = '';
            res.on('data', function(chunk) {
                data += chunk;
            });
            res.on('end', function() {
                var d = JSON.parse(data);
                var obj = d.candidates;
                if(obj != '') {
                    var loc = obj[0].location
                    var location = {
                        lat: loc.x,
                        lng: loc.y
                    }
                    return location
                } else {
                    return address
                }
            });
            res.on('error', function(err) {
                console.log("error!")
            });
        });
    }
}

如果有更好的方法可以做到这一点,我不会考虑总是愿意学习。

1 个答案:

答案 0 :(得分:0)

您的位置对象到底是什么样的?这有点黑客,但关联数组/字典可能会帮助你。

假设您制作了一些位置对象(在Chrome的开发控制台中完成,因此您可以看到每个语句返回的内容)。

首先创建一个位置对象:

place1 = {}
>Object {}
place1.name = "SomePlace"
>"SomePlace"
place1.address = "123 Sesame St."
>"123 Sesame St."

然后,为了更好的衡量,创建另一个:

place2 = {}
>Object {}
place2.name = "AnotherPlace"
>"AnotherPlace"
place2.address = "456 Main St."
>"456 Main St."

现在,让您的locy数组保留这些位置:

locy = []
>[]
locy.push(place1)
>1
locy
>[Object]
locy.push(place2)
>2
locy[1]
>Object {name: "AnotherPlace", address: "456 Main St."}

现在,您可以直接附加到这些对象:

locy[1].lat = 35
>35
locy[1]
>Object {name: "AnotherPlace", address: "456 Main St.", lat: 35}

因此,在您的情况下,只需使用此类对象填充locy,并将其传递到getLoc()函数中。然后,您仍然可以使用for循环对其进行迭代,并将lat / lon数据与您的locy[i]address变量相关联。