Skip to content

Instantly share code, notes, and snippets.

@sawantakash321
Last active August 31, 2017 00:34
Show Gist options
  • Save sawantakash321/40387c01d71bbd6fb06bafe9201cd6ae to your computer and use it in GitHub Desktop.
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).
'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