Last active
August 31, 2017 00:34
-
-
Save sawantakash321/40387c01d71bbd6fb06bafe9201cd6ae to your computer and use it in GitHub Desktop.
NodeJS/JavaScript program that reads our list of partners(partners.JSON) and outputs the company names and addresses of matching partners (with offices within 100km) sorted by company name (ascending).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict' | |
var request = require("request"); | |
var http = require('http'); | |
var url = "https://success.spidergap.com/partners.json"; | |
//Converting central london location from degrees into radians | |
const londonLat = 51.515419 * (Math.PI / 180); | |
const londonLong = -0.141099 * (Math.PI / 180); | |
var londonMeetPartners = [{ | |
name: "", | |
address: "" | |
}]; | |
var distance = 0; | |
var key, partner, k; | |
request({ | |
url: url, | |
json: true | |
}, function(error, response, allPartners) { | |
if (allPartners == undefined || allPartners == null || allPartners == "") { | |
throw new Error("There is no data in JSON file"); | |
} | |
if (!error && response.statusCode === 200) { | |
//function to check whether location is within 100km | |
function withinrange(partnerObj) { | |
var arr = partnerObj.split(","); | |
//Converting partner locations from degrees into radians | |
var partnerLat = arr[0] * (Math.PI / 180); | |
var partnerLong = arr[1] * (Math.PI / 180); | |
//orthodromic distance formula to calculate distance | |
var d = Math.acos(Math.sin(londonLat) * Math.sin(partnerLat) + | |
Math.cos(londonLat) * Math.cos(partnerLat) * | |
Math.cos(londonLong - partnerLong)); | |
distance = d * 100; | |
//checking whether distance is less than 100km | |
if (distance < 100) { | |
return true; | |
} else { | |
return false; | |
} | |
} | |
for (key in allPartners) { | |
if (allPartners.hasOwnProperty(1)) { | |
partner = allPartners[key]; | |
if (partner.organization == undefined) { | |
throw new Error("There is no company name data"); | |
} else if (partner.offices == undefined) { | |
throw new Error("Offices property is undefined"); | |
} | |
for (k = 0; k < partner.offices.length; k++) { | |
if (withinrange(partner.offices[k].coordinates)) { | |
londonMeetPartners.push({ | |
name: partner.organization, | |
address: partner.offices[k].address | |
}); | |
} | |
} | |
} | |
} | |
//function to sort by property | |
function getSort(name) { | |
return function(a, b) { | |
if (a[name] > b[name]) { | |
return 1; | |
} else if (a[name] < b[name]) { | |
return -1; | |
} | |
return 0; | |
} | |
} | |
londonMeetPartners.sort(getSort("name")); | |
londonMeetPartners.shift(); | |
//Creating server to display sorted final meet partners | |
http.createServer(function(req, res) { | |
res.writeHead(200, { | |
'Content-Type': 'text/html' | |
}); | |
res.write("<table style='font-family: arial, sans-serif;" + | |
"border-collapse: collapse;width: 100%;'><tr>" + | |
"<th style='border: 1px solid #dddddd;text-align:" + | |
" left;padding: 8px;'>Company Name</th>" + | |
"<th style='border: 1px solid #dddddd;text-align:" + | |
"left;padding: 8px;'>Company Address</th>" + | |
"</tr>"); | |
for (var item in londonMeetPartners) { | |
res.write("<tr><td style='border: 1px solid #dddddd;" + | |
"text-align: left;padding: 8px;'>" + londonMeetPartners[item].name + "</td>"); | |
res.write("<td style='border: 1px solid #dddddd;" + | |
"text-align: left;padding: 8px;'>" + londonMeetPartners[item].address + "</td></tr>"); | |
} | |
res.write("</table>"); | |
res.end(); | |
}).listen(8080); | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment